В «What does it mean to use the name of a class for string interpolation?» Кандид предположил, что #{}
внутри строки неявно вызывает to_s
. Так, например:Является ли # {} всегда эквивалентным to_s?
my_array = [1, 2, 3, 4]
p my_array.to_s # => "[1, 2, 3, 4]"
p "#{my_array}" # => "[1, 2, 3, 4]"
Однако, если to_s
для массива переопределен как показано ниже, я хотел бы получить разные результаты:
class Array
def to_s
self.map { |elem| elem.to_s }
end
end
p my_array.to_s # => ["1", "2", "3", "4"]
p "#{my_array}" # => "#<Array:0x007f74924c2bc0>"
Я предполагаю, что это происходит в любое время и в любом случае to_s
отменяется.
Что я должен делать, чтобы сохранить равенство между to_s
и выражением #{}
в строке, если это возможно?
Я столкнулся с этой проблемой в RubyMonk lesson: что в соответствии с уроком # {ogres}
должно вернуться, согласно моему опыту, это нечто иное.
to_s должен возвращать строку, ваш вызов карты возвращает массив –