p vs放入Ruby

时间:2009-08-10 14:44:50

标签: ruby

Ruby中pputs之间有什么区别吗?

7 个答案:

答案 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 fooputs 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)

来自ruby-2.4.1 document

  

<强> 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

  

<强> 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)