Строки являются особым случаем, потому что вы можете использовать интерполяцию строк для неявного вызова to_s
:
obj = Object.new.tap {|o|
def o.to_s
'object!'
end
def o.inspect
'[object]'
end
}
"foo: " + obj # TypeError
"foo: #{obj}"
=> "foo: object!"
Я переопределил inspect
, чтобы показать, что вызывается to_s
, а не inspect
,На ruby 1.9 Object#inspect
вызывает to_s
, поэтому, если я не переопределю inspect
, вышеприведенный код не покажет, какой именно метод вызывался во время интерполяции.