Ruby中的“p”是什么?

47

我确定对于那些懂的人来说,这是一个愚蠢的问题,但我找不到它到底是什么或者它是做什么的解释。

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

"p row" 是什么作用?

6个回答

86

p()是Kernel方法

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

由于Object混合了Kernel模块,因此p()方法在任何地方都可用。

顺便说一下,在“诗歌模式”下使用它很常见,这意味着括号会被省略。CSV片段可以写成...

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

这个功能在 Kernel 模块中有文档记录。


2
直接链接到 p 的文档 - http://www.ruby-doc.org/core-1.8.7/Kernel.html#method-i-p - Joe

24

Kernel#pKernel#puts 的小兄弟,主要用于调试:它几乎与 Kernel#puts 完全相同,但是它使用 #inspect 方法而不是 #to_s 方法来转换参数。

它被命名为如此晦涩的名字的原因是为了方便在调试时快速添加到表达式中并再次取出。(我猜现在 Ruby 越来越好地支持“适当”的调试功能,该方法已经没有那么有用了。)

一些替代 Kernel#p 的方法包括标准库 ppKernel#pp(美化输出)和标准库 yamlKernel#y(YAML 格式输出)。


5
为什么不试一下呢?
>> [1,2,3].each { |d| p d }
1
2
3

3
实际上,它首先调用#inspect方法来处理它的参数,但已经足够接近了 ;) - hrnt
真实的。我去掉了"alias"这个评论,因为它只是完全错误的。可能更像是“包装器”。 - rfunduk

2
您已经在系统上拥有的文档的另一个选项是ri命令。您可以随时输入:ri p,或者如果p在许多地方(它确实在许多地方)被定义为中央命令,则可以尝试ri Kernel.p。其他好的选择是Array.<whatever method>String.<whatever method>
如果您最终安装了一堆gem,这将会大大减慢速度,但您可以查找快速的fastri gem,它会极大地加快查找过程。

1

0
要理解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">  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接