为什么 `p` 和 `puts` 给出相同的输出?都在调用 `to_s` 吗?

Why do `p` and `puts` give the same output? Are both calling `to_s`?

在下面的代码中,pputs 给出相同的输出。

class Book
  def initialize(title, price)
    @title = title
    @price = price
  end  
  def to_s
    "book with title=#{@title} and price=#{@price}"
  end
end

book1 = Book.new("Book of Ruby", 50.63)
puts book1 # => book with title=Book of Ruby and price=50.63
p book1    # => book with title=Book of Ruby and price=50.63

为什么会这样? p 应该调用 book1.inspect 而不是 book1.to_s

在ruby 1.9 中,inspect 的默认行为是调用to_s。这在以后的版本中发生了变化。如果您想要不同的输出,您可能必须覆盖 inspectto_s,或者升级您的 ruby 版本。

看这里:http://ruby-doc.org/core-1.9.3/Object.html#method-i-inspect

If not overridden, uses the to_s method to generate the string.