2009-11-18 41 views
43

Tôi chắc chắn đó là một câu hỏi ngớ ngẩn đối với những người biết, nhưng tôi không thể tìm thấy giải thích về những gì nó làm hay nó là gì."p" trong Ruby là gì?

CSV.open('data.csv', 'r') do |row| 
    p row 
end 

"p row" làm gì?

Trả lời

77

p() là một phương pháp Kernel

Nó viết obj.inspect đến đầu ra tiêu chuẩn.

Vì đối tượng trộn trong mô-đun hạt nhân, phương pháp p() khả dụng ở mọi nơi.

Thông thường, btw, để sử dụng nó ở chế độ thơ, có nghĩa là các số lần bỏ bớt. Đoạn mã CSV có thể được viết như ...

CSV.open 'data.csv', 'r' do |row| 
    p row 
end 

Tài liệu là here with the rest of the Kernel mô-đun.

+1

+1 để thêm liên kết vào tài liệu – edwardsmatt

+1

Liên kết trực tiếp vào tài liệu cho p - http://www.ruby-doc.org/core-1.8.7/Kernel.html#method-i-p – Joe

5

Tại sao bạn không dùng thử?

>> [1,2,3].each { |d| p d } 
1 
2 
3 
+3

Thực ra nó gọi '# inspect' trước đối số của nó trước, nhưng đóng đủ;) – hrnt

+0

True. Đã xóa nhận xét 'bí danh' của tôi vì nó chỉ đơn giản là sai. Có thể giống như 'wrapper' hơn. – rfunduk

22

Kernel#p là người anh em gỡ lỗi nhỏ của Kernel#puts: ít nhiều hoạt động chính xác như nó, nhưng nó chuyển đổi các đối số của nó bằng cách sử dụng #inspect thay vì #to_s.

Lý do tại sao nó có một tên bí ẩn như vậy là bạn có thể nhanh chóng ném nó vào một biểu thức và đưa nó ra một lần nữa khi gỡ lỗi. (Tôi đoán đó là ít hơn rất nhiều hữu ích bây giờ mà Ruby nhận được "đúng" gỡ lỗi hỗ trợ tốt hơn và tốt hơn.)

Một số lựa chọn thay thế để Kernel#pKernel#pp (in đẹp) từ pp thư viện tiêu chuẩn và Kernel#y (YAML) từ yaml thư viện chuẩn.

2

Tùy chọn khác cho tài liệu mà bạn đã có trên hệ thống của mình là lệnh ri. Bất cứ lúc nào bạn có thể nhập: ri p hoặc nếu p được xác định ở rất nhiều địa điểm cho lệnh trung tâm, bạn có thể thử ri Kernel.p. Các cược tốt khác là Array.<whatever method> hoặc String.<whatever method>.

Nếu bạn kết thúc cài đặt một loạt các đá quý này sẽ làm chậm rất nhiều nhưng bạn có thể tra cứu viên đá quý fastri để tăng tốc quá trình tra cứu cực kỳ.

0

Để hiểu sự khác biệt giữa p và puts, bạn phải hiểu sự khác biệt giữa to_s() và instance() phương pháp.

to_s được sử dụng để lấy biểu diễn chuỗi của đối tượng trong khi instance là phiên bản thân thiện với nhà phát triển hơn của to_s cũng cung cấp nội dung của các đối tượng.

class Dog 
     def initialize(name, breed) 
      @name = name 
      @breed = breed 
     end 
     def to_s 
      puts "#@name's breed is #@breed." 
     end 
end 

terra=Dog.new("Terra","Husky") 
puts terra #Terra's breed is Husky. 
p terra #<Dog:0x00007fbde0932a88 @name="Terra", @breed="Husky">