Ruby中的“p”是什么?

时间:2009-11-18 19:03:26

标签: ruby printf-debugging

我确信这对那些知道的人来说是一个愚蠢的问题,但我无法找到它的作用或内容的解释。

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

p row”做什么?

5 个答案:

答案 0 :(得分:79)

p()是一个内核方法

它将obj.inspect写入标准输出。

因为对象在内核模块中混合,所以p()方法随处可用。

诗歌模式中使用它是很常见的,这意味着parens被丢弃了。 CSV代码段可以写成......

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

记录了here with the rest of the Kernel模块。

答案 1 :(得分:22)

Kernel#pKernel#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/