Рассмотрим следующий фрагмент кода:
class Example
def my_attr=(value)
@_my_attr = value
@_my_attr * 3
end
end
Я ожидаю, что выражение Example.new.my_attr = 5
вернет 15
, но это окажется неправильным. Возвращаемое исходное значение всегда возвращается, даже если я вызываю метод =
явно:
Example.new.my_attr = 5 # => 5
Example.new.my_attr=(5) # => 5
Как и почему Ruby делает это? Использует ли Ruby методы, которые заканчиваются на =
, или это какой-то другой механизм? Я предполагаю, что это исключает цепочку для возвращаемых значений методов =
, правильно? Есть ли способ заставить Ruby вести себя по-другому или это именно так?
Обновление: кредит для @jeffgran для этого:
Example.new.send(:my_attr=, 5) # => 15
Это обходной путь, но на другом уровне еще более запутанный, поскольку это означает, что send
явно не всегда эквивалентно поведению для прямого вызова метода.