为什么我必须显式调用重写的 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_s
(puts
还包含其他一些 [=26= 的显式实现], 比如数组)
另一方面,如果您在还不是字符串的对象上定义了 to_s
方法,那么应该调用您的 to_s 方法
class Foo
def to_s
'hello world'
end
end
puts Foo.new
会输出'hello world'.
这是 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_s
(puts
还包含其他一些 [=26= 的显式实现], 比如数组)
另一方面,如果您在还不是字符串的对象上定义了 to_s
方法,那么应该调用您的 to_s 方法
class Foo
def to_s
'hello world'
end
end
puts Foo.new
会输出'hello world'.