46

我敢肯定,对于那些知道的人来说,这是一个愚蠢的问题,但我找不到它的作用或它是什么的解释。

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

p row”有什么作用?

4

6 回答 6

83

p()是一种内核方法

它写入obj.inspect标准输出。

由于 Object 混合在 Kernel 模块中,因此该p()方法随处可用。

顺便说一句,在诗歌模式中使用它很常见,这意味着括号被删除。CSV 片段可以写成...

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

它与内核模块的其余部分一起记录在此处。

于 2009-11-18T19:07:24.900 回答
23

Kernel#p是 的调试小兄弟Kernel#puts:它或多或少的工作方式与它完全一样,但它使用#inspect而不是转换它的参数#to_s

它之所以有这样一个神秘的名字,是为了让你在调试的时候可以快速把它扔进一个表达式中,然后再取出来。(我想现在 Ruby 的“正确”调试支持越来越好,它的用处要小得多了。)

Kernel#p标准库中的Kernel#pp(漂亮打印)和pp标准库中的Kernel#y(YAML)的一些替代方案yaml

于 2009-11-18T19:33:26.423 回答
5

为什么不试试呢?

>> [1,2,3].each { |d| p d }
1
2
3
于 2009-11-18T19:05:05.070 回答
2

您系统上已有的文档的另一个选项是ri命令。您可以随时键入:ri p或者如果p在很多地方(确实如此)定义了中央命令,您可以尝试ri Kernel.p. 其他好的赌注是Array.<whatever method>String.<whatever method>

如果您最终安装了一堆 gem,这会减慢很多,但是您可以查找 fastri gem,这会极大地加快查找过程。

于 2009-11-18T19:51:42.400 回答
1

Kernel#p 不如 print 和 puts 广为人知。

它与 puts 类似,它添加了一个换行符,但不是调用 to_s,而是 p 调用检查。

参考

http://garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-ruby/

于 2014-07-17T04:37:28.973 回答
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">  
于 2017-11-27T21:08:12.063 回答