我敢肯定,对于那些知道的人来说,这是一个愚蠢的问题,但我找不到它的作用或它是什么的解释。
CSV.open('data.csv', 'r') do |row|
p row
end
“ p row
”有什么作用?
我敢肯定,对于那些知道的人来说,这是一个愚蠢的问题,但我找不到它的作用或它是什么的解释。
CSV.open('data.csv', 'r') do |row|
p row
end
“ p row
”有什么作用?
p()
是一种内核方法它写入obj.inspect
标准输出。
由于 Object 混合在 Kernel 模块中,因此该p()
方法随处可用。
顺便说一句,在诗歌模式中使用它很常见,这意味着括号被删除。CSV 片段可以写成...
CSV.open 'data.csv', 'r' do |row|
p row
end
它与内核模块的其余部分一起记录在此处。
Kernel#p
是 的调试小兄弟Kernel#puts
:它或多或少的工作方式与它完全一样,但它使用#inspect
而不是转换它的参数#to_s
。
它之所以有这样一个神秘的名字,是为了让你在调试的时候可以快速把它扔进一个表达式中,然后再取出来。(我想现在 Ruby 的“正确”调试支持越来越好,它的用处要小得多了。)
Kernel#p
标准库中的Kernel#pp
(漂亮打印)和pp
标准库中的Kernel#y
(YAML)的一些替代方案yaml
。
为什么不试试呢?
>> [1,2,3].each { |d| p d }
1
2
3
您系统上已有的文档的另一个选项是ri
命令。您可以随时键入:ri p
或者如果p
在很多地方(确实如此)定义了中央命令,您可以尝试ri Kernel.p
. 其他好的赌注是Array.<whatever method>
或String.<whatever method>
。
如果您最终安装了一堆 gem,这会减慢很多,但是您可以查找 fastri gem,这会极大地加快查找过程。
Kernel#p 不如 print 和 puts 广为人知。
它与 puts 类似,它添加了一个换行符,但不是调用 to_s,而是 p 调用检查。
参考
http://garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-ruby/
要了解 p 和 puts 之间的区别,您必须了解 to_s() 和 instance() 方法之间的区别。
to_s 用于获取对象的字符串表示,而instance是 to_s 对开发人员更友好的版本,它也提供对象的内容。
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">