Ruby中p
和puts
之间有什么区别吗?
答案 0 :(得分:318)
p foo
打印foo.inspect
后跟换行符,即打印inspect
而不是to_s
的值,这更适合调试(因为你可以告诉它) 1
,"1"
和"2\b1"
之间的差异,在没有inspect
的情况下打印时无法区分。
答案 1 :(得分:53)
同样重要的是要注意puts
“对已定义to_s
的类做出反应,p
没有。例如:
class T
def initialize(i)
@i = i
end
def to_s
@i.to_s
end
end
t = T.new 42
puts t => 42
p t => #<T:0xb7ecc8b0 @i=42>
这直接来自.inspect
电话,但在实践中并不明显。
答案 2 :(得分:38)
p foo
与puts foo.inspect
答案 3 :(得分:2)
除了上面的答案之外,控制台输出还有一个细微的区别 - 即存在/不存在引号/引号 - 这可能很有用:
<h2>What day is it?</h2>
<p id="demo"></p>
如果您想使用近亲打印制作一个简单的进度条,我觉得这很有用:
p "+++++"
>> "+++++"
puts "====="
>> =====
这给出了100%进度条:
array = [lots of objects to be processed]
array.size
>> 20
这会在每次迭代中添加增量*:
puts "*" * array.size
>> ********************
答案 4 :(得分:1)
<强>
puts(obj, ...) → nil
强>将给定对象写入ios。在任何后面写一个换行符 尚未以换行符结尾。 返回nil 。
必须打开流才能写入。如果使用数组进行调用 参数,在新行上写每个元素。每个给定的对象 不是字符串或数组将通过调用其
to_s
进行转换 方法。如果不带参数调用,则输出一个换行符。
让我们试试irb
# always newline in the end
>> puts # no arguments
=> nil # return nil and writes a newline
>> puts "sss\nsss\n" # newline in string
sss
sss
=> nil
>> puts "sss\nsss" # no newline in string
sss
sss
=> nil
# for multiple arguments and array
>> puts "a", "b"
a
b
=> nil
>> puts "a", "b", ["c", "d"]
a
b
c
d
=> nil
<强>
p(obj) → obj click to toggle source
强>
的p(obj1, obj2, ...) → [obj, ...]
强> 的p() → nil
强>
对于每个对象,直接写入obj.inspect
,然后在程序的标准输出中添加换行符。
in irb
# no arguments
>> p
=> nil # return nil, writes nothing
# one arguments
>> p "sss\nsss\n"
"sss\nsss\n"
=> "aaa\naaa\n"
# multiple arguments and array
>> p "a", "b"
"a"
"b"
=> ["a", "b"] # return a array
>> p "a", "b", ["c", "d"]
"a"
"b"
["c", "d"]
=> ["a", "b", ["c", "d"]] # return a nested array
答案 5 :(得分:1)
这些2相等:
p "Hello World"
puts "Hello World".inspect
(与 to_s 方法相比,检查提供了更直观的对象视图)
答案 6 :(得分:0)
这可能说明关键区别之一是p
返回传递给它的值,而puts
返回nil
。
def foo_puts
arr = ['foo', 'bar']
puts arr
end
def foo_p
arr = ['foo', 'bar']
p arr
end
a = foo_puts
=>nil
a
=>nil
b = foo_p
=>['foo', 'bar']
b
['foo', 'bar']
基准显示puts
较慢
require 'benchmark'
str = [*'a'..'z']
str = str*100
res = Benchmark.bm do |x|
x.report(:a) { 10.times {p str} }
x.report(:b) { 10.times {puts str} }
end
puts "#{"\n"*10}"
puts res
0.010000 0.000000 0.010000 ( 0.047310)
0.140000 0.090000 0.230000 ( 0.318393)