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