Кажется, что строковая интерполяция обрабатывает объекты типа String
по-разному:
irb(main):011:0> class MyString < String
irb(main):012:1> def initialize(str)
irb(main):013:2> @str = str
irb(main):014:2> end
irb(main):015:1> def to_s
irb(main):016:2> puts "to_s called!"
irb(main):017:2> @str
irb(main):018:2> end
irb(main):019:1> end
=> nil
irb(main):020:0> "#{MyString.new('foo')}"
=> ""
Как видите, to_s
даже не вызывается.Причиной этого является инвариант str.to_s == str
, где str.is_a? String
.Вы нарушили этот инвариант, запутав тем самым код библиотеки.
Заключение : не переопределяйте to_s
, если вы используете подкласс String
(в любом случае это не имеет большого смысла).