我确信这对那些知道的人来说是一个愚蠢的问题,但我无法找到它的作用或内容的解释。
CSV.open('data.csv', 'r') do |row|
p row
end
“p row
”做什么?
答案 0 :(得分:79)
p()
是一个内核方法它将obj.inspect
写入标准输出。
因为对象在内核模块中混合,所以p()
方法随处可用。
在诗歌模式中使用它是很常见的,这意味着parens被丢弃了。 CSV代码段可以写成......
CSV.open 'data.csv', 'r' do |row|
p row
end
答案 1 :(得分:22)
Kernel#p
是Kernel#puts
的小调试兄弟:它或多或少与它完全相同,但它使用#inspect
代替#to_s
转换其参数。
它之所以具有如此神秘的名称,是因为您可以快速将其放入表达式并在调试时再将其取出。 (我认为现在Ruby正在变得越来越好“正确”的调试支持,因此它没那么有用。)
Kernel#p
的一些替代方案是来自Kernel#pp
标准库的pp
(非常打印)和来自Kernel#y
标准库的yaml
(YAML)。< / p>
答案 2 :(得分:5)
为什么不试试呢?
>> [1,2,3].each { |d| p d }
1
2
3
答案 3 :(得分:2)
您系统上已有的文档的另一个选项是ri
命令。您可以随时键入:ri p
或者如果p
在很多位置(对于中央命令)定义,您可以尝试ri Kernel.p
。其他好的投注是Array.<whatever method>
或String.<whatever method>
。
如果您最终安装了一堆宝石,这将会减慢很多,但您可以查找fastri宝石,这会极大地加速查找过程。
答案 4 :(得分:1)
内核#p比print和puts更为人所知。
类似于put,它添加了换行符,但是不是调用to_s,而是调用inspect。
参考
http://garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-ruby/