p vs放入Ruby

pputs 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 fooputs 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 >> ******