我确定对于那些懂的人来说,这是一个愚蠢的问题,但我找不到它到底是什么或者它是做什么的解释。
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()
是Kernel方法它将obj.inspect
写入标准输出。
由于Object混合了Kernel模块,因此p()
方法在任何地方都可用。
顺便说一下,在“诗歌模式”下使用它很常见,这意味着括号会被省略。CSV片段可以写成...
CSV.open 'data.csv', 'r' do |row|
p row
end
这个功能在 Kernel 模块中有文档记录。
Kernel#p
是 Kernel#puts
的小兄弟,主要用于调试:它几乎与 Kernel#puts
完全相同,但是它使用 #inspect
方法而不是 #to_s
方法来转换参数。
它被命名为如此晦涩的名字的原因是为了方便在调试时快速添加到表达式中并再次取出。(我猜现在 Ruby 越来越好地支持“适当”的调试功能,该方法已经没有那么有用了。)
一些替代 Kernel#p
的方法包括标准库 pp
的 Kernel#pp
(美化输出)和标准库 yaml
的 Kernel#y
(YAML 格式输出)。
>> [1,2,3].each { |d| p d }
1
2
3
#inspect
方法来处理它的参数,但已经足够接近了 ;) - hrntri
命令。您可以随时输入:ri p
,或者如果p
在许多地方(它确实在许多地方)被定义为中央命令,则可以尝试ri Kernel.p
。其他好的选择是Array.<whatever method>
或String.<whatever method>
。Kernel#p比print和puts不那么出名。
它与puts类似,因为它添加换行符,但p调用inspect而不是to_s。
参考资料
http://garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-ruby/
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">