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ì?
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ì?
p()
là một phương pháp KernelNó 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.
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#p
là Kernel#pp
(in đẹp) từ pp
thư viện tiêu chuẩn và Kernel#y
(YAML) từ yaml
thư viện chuẩn.
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ỳ.
Hạt nhân # p ít được biết đến hơn là in và đặt.
Nó tương tự như đặt ở chỗ nó thêm một dòng mới, nhưng thay vì gọi to_s, p cuộc gọi kiểm tra.
Tài liệu tham khảo
http://garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-ruby/
Để 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">
+1 để thêm liên kết vào tài liệu – edwardsmatt
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