关于p和puts

by 小赓赓。 at over 8 years ago, last updated at over 8 years ago
W

一直不太明白p和puts到底什么区别,研究了一下:

class Foo
  def inspect
     "foo from inspect"
  end

  def to_s
    "foo from to_s"
  end
end

foo = Foo.new
p foo
puts foo
p "p: <#{foo}>"
puts "p: <#{foo}>"

=>foo from inspect
=>foo from to_s
=>p: <foo from to_s>
=>puts: <foo from to_s>

说明p 是使用 obj 的 inspect 方法,而 puts 是 to_s 方法。to_s 是对象的字符串表示, 是 puts 和双引号字符使用的方法。inspect 是对象状态的表示,用于 debug 中。 查了一下Object 中的定义了 to_s 和 inspect 方法,默认都是返回对象的类名和地址。

另外:

p "a","\nbb"
puts "a","\nbb"
#输出结果:
"a"
"\nbb"
a

bb

所以可以看出:

  • puts会识别双引号內的转义符,并自动换行
  • p不会识别双引号內的转义符,并自动换行