p vs放入Ruby

col*_*rco 261 ruby

Ruby pputsRuby 之间有什么区别吗?

sep*_*p2k 323

p foo打印foo.inspect后跟一个换行符,即它打印的值inspect代替to_s,更适合调试(因为你可以告诉它们之间的区别1,"1"并且"2\b1",在没有打印时你不能inspect).

  • 请注意,`p`也返回对象的值,而`puts`则不返回.`1.9.3p125:002>(p"foo").class"foo"=> String 1.9.3p125:003>(put"foo").class foo => NilClass` (15认同)
  • 是的,p(和puts)都在内核模块中,所以你可以在这里看到详细信息:http://www.ruby-doc.org/core/classes/Kernel.html#M005961 (7认同)
  • Gareth Rees在题为["Ruby p vs puts vs print"]的帖子中提供的精彩摘要(http://www.garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in -红宝石/). (2认同)

ezp*_*zpz 54

同样重要的是要注意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>
Run Code Online (Sandbox Code Playgroud)

这直接来自.inspect呼叫,但在实践中并不明显.


Aug*_*aas 37

p foo 是相同的 puts foo.inspect

  • 那是错的.它与`puts foo.inspect;相同; foo` (10认同)
  • 但是`puts`返回`nil`,而不是'f``和`p`. (4认同)

fan*_*ing 5

来自ruby​​-2.4.1 文档

\n\n

看跌期权

\n\n
\n

puts(obj, ...) \xe2\x86\x92 nil

\n\n

将给定对象写入 ios。在任何尚未换行符序列结尾的行之后写入换行符返回 nil

\n\n

必须打开流才能写入。如果使用数组\n 参数调用,则将每个元素写入新行。每个不是字符串或数组的给定对象\n 将通过调用其to_s\n 方法进行转换。如果不带参数调用,则输出一个换行符。

\n
\n\n

我们在 irb 上试试

\n\n
# always newline in the end \n>> puts # no arguments\n\n=> nil # return nil and writes a newline\n>> puts "sss\\nsss\\n" # newline in string\nsss\nsss\n=> nil\n>> puts "sss\\nsss" # no newline in string\nsss\nsss\n=> nil\n\n# for multiple arguments and array\n>> puts "a", "b"\na\nb\n=> nil\n>> puts "a", "b", ["c", "d"]\na\nb\nc\nd\n=> nil\n
Run Code Online (Sandbox Code Playgroud)\n\n

p

\n\n
\n

p(obj) \xe2\x86\x92 obj click to toggle source
\n p(obj1, obj2, ...) \xe2\x86\x92 [obj, ...]\n \n 对于每个对象,直接将后跟换行符写入程序\xe2\x80\x99s 标准输出。p() \xe2\x86\x92 nil
obj.inspect

\n
\n\n

在IRB中

\n\n
# no arguments\n>> p\n=> nil # return nil, writes nothing\n# one arguments\n>> p "sss\\nsss\\n" \n"sss\\nsss\\n"\n=> "aaa\\naaa\\n"\n# multiple arguments and array\n>> p "a", "b"\n"a"\n"b"\n=> ["a", "b"] # return a array\n>> p "a", "b", ["c", "d"]\n"a"\n"b"\n["c", "d"]\n=> ["a", "b", ["c", "d"]] # return a nested array\n
Run Code Online (Sandbox Code Playgroud)\n