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

时间:2015-11-17 04:24:47

标签: ruby ruby-1.9

在以下代码中,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

1 个答案:

答案 0 :(得分:3)

在ruby 1.9中,to_s的默认行为是调用inspect。这在以后的版本中已更改。如果您想要不同的输出,或者只是升级您的ruby版本,您可能必须覆盖to_s以及iex (30)> Enum.reduce([1,2,3,4], &(IO.puts("a#{&1} b#{&2}"))) a2 b1 a3 bok a4 bok

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

  

如果未覆盖,则使用to_s方法生成字符串。