p vs放入Ruby
p
和puts
Ruby中有没有区别?
p foo
打印foo.inspect
后跟一个换行符,即它打印inspect
的值而不是to_s
,这更适合于debugging(因为你可以例如说明1
, "1"
和"2\b1"
之间的差别,打印时无法inspect
)。
同样重要的是要注意, puts
所定义的类进行“反应”,而不是。 例如:
class T def initialize(i) @i = i end def to_s @i.to_s end end t = T.new 42 puts t => 42 pt => #<T:0xb7ecc8b0 @i=42>
这跟调查直接有关,但实际上并不明显。
p foo
与puts foo.inspect
相同
从ruby-2.4.1文件
看跌期权
puts(obj, ...) → nil
将给定的对象写入ios。 在没有以换行符结束的任何之后写入换行符。 返回nil 。
该stream必须打开才能写入。 如果使用数组参数调用,则将每个元素写入新行。 每个给定的不是string或数组的对象都将通过调用其
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
后面跟着换行符到程序的标准输出。
在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
除了上面的答案之外,控制台输出的细微差别 – 也就是有无引号/引号 – 可能是有用的:
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 >> ******