2024-04-18 09:00:04

p vs放入Ruby

在Ruby中p和puts有区别吗?


当前回答

除了上面的答案,在控制台输出中有一个微妙的差异——即存在/不存在倒逗号/引号——这可能是有用的:

p "+++++"
>> "+++++"

puts "====="
>> =====

我发现如果你想做一个简单的进度条,使用它们的近亲,打印,这个很有用:

array = [lots of objects to be processed]
array.size
>> 20

这给出了100%进度条:

puts "*" * array.size
>> ********************

这将在每次迭代中增加一个增量*:

array.each do |obj|
   print "*"
   obj.some_long_executing_process
end

# This increments nicely to give the dev some indication of progress / time until completion
>> ******

其他回答

这可能说明了一个关键的区别,即p返回传递给它的值,而as 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']

基准数据显示看跌期权速度较慢

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)

同样重要的是要注意,put“react”到一个定义了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调用,但在实践中并不明显。

foo和foo。inspect是一样的

P方法将打印更广泛的可调试消息,其中put将美化消息代码。

例:请看下面的代码行:

msg = "hey, Use \#{ to interpolate expressions"
puts msg #clean msg
p msg #shows \ with #

输出将是

hey, Use #{ to interpolate expressions
"hey, Use \#{ to interpolate expressions"

查看输出PIC以获得更清晰的信息

除了上面的答案,在控制台输出中有一个微妙的差异——即存在/不存在倒逗号/引号——这可能是有用的:

p "+++++"
>> "+++++"

puts "====="
>> =====

我发现如果你想做一个简单的进度条,使用它们的近亲,打印,这个很有用:

array = [lots of objects to be processed]
array.size
>> 20

这给出了100%进度条:

puts "*" * array.size
>> ********************

这将在每次迭代中增加一个增量*:

array.each do |obj|
   print "*"
   obj.some_long_executing_process
end

# This increments nicely to give the dev some indication of progress / time until completion
>> ******