Я думал, что Ruby просто вызовет метод to_s, но я не могу объяснить, как это работает:
class Fake
def to_s
self
end
end
"#{Fake.new}"
По логике это должно повысить уровень стека слишком глубоко из-за бесконечности рекурсии. Но он отлично работает и, кажется, вызывает #to_s из Object.
=> "#<Fake:0x137029f8>"
Но почему?
ДОБАВЛЕНО:
class Fake
def to_s
Fake2.new
end
end
class Fake2
def to_s
"Fake2#to_s"
end
end
Этот код работает по-разному в двух случаях:
puts "#{Fake.new}" => "#<Fake:0x137d5ac4>"
Но:
puts Fake.new.to_s => "Fake2#to_s"
Я думаю, что это ненормально. Может ли кто-нибудь предложить, когда в рубиновом интерпретаторе это происходит внутри?