为什么我必须显式调用重写的 to_s 方法,而不是像我期望的那样隐式调用 puts

Why do I have to call overridden to_s method explicitly and not implicitly as I would expect with puts

这是 irb 会话,我在其中覆盖了字符串 class 的 to_s 但不得不显式调用 to_s

➜ irb
2.2.0 :001 > class String
2.2.0 :002?>   def to_s
2.2.0 :003?>     swapcase
2.2.0 :004?>     end
2.2.0 :005?>   end
 => :to_s
2.2.0 :006 > puts 'hello'
hello
 => nil
2.2.0 :007 > p 'hello'
"hello"
 => "hello"
2.2.0 :008 > puts 'hello'.to_s
HELLO
 => nil

这是行不通的,因为 puts 只对还不是字符串的东西调用 to_s。在您的情况下 'hello' 已经是一个字符串,因此 puts 不需要调用 to_sputs 还包含其他一些 [=26= 的显式实现], 比如数组)

另一方面,如果您在还不是字符串的对象上定义了 to_s 方法,那么应该调用您的 to_s 方法

class Foo
  def to_s
    'hello world'
  end
end
puts Foo.new

会输出'hello world'.