Как говорит Мартин, это нарушит цепочку заданий.
Способ, которым методы назначения ruby определены для работы, расширяет MyClass.property = 3
до эквивалента (lambda { |v| MyClass.send('property=', v); v })[3]
(не совсем, но это показывает, как работает цепочка). Возвращаемым значением присваивания всегда является присвоенное значение.
Если вы хотите увидеть результат вашего MyClass#property=
метода, используйте #send
:
irb> o = Object.new
=> #<Object:0x15270>
irb> def o.x=(y)
irb> @x = y+1
irb> puts "y = #{y}, @x = #@x"
irb> true
irb> end
=> nil
irb> def o.x
irb> puts "@x = #@x"
irb> @x
irb> end
=> nil
irb> o.x = 4
y = 4, @x = 5
=> 4
irb> o.x
@x = 5
=> 5
irb> o.send('x=', 3)
y = 3, @x = 4
=> true
Тем не менее, рубиновый способ сделать это с исключениями - если что-то пойдет не так во время
назначение, поднять исключение. Тогда все вызывающие должны справиться с этим, если что-то пойдет
неверно, в отличие от возвращаемого значения, которое можно легко игнорировать:
# continued from above...
irb> def o.x=(y)
irb> unless y.respond_to? :> and (y > 0 rescue false)
irb> raise ArgumentError, 'new value must be > 0', caller
irb> end
irb> @x = y + 1
irb> puts "y = #{y}, @x = #@x"
irb> end
=> nil
irb> o.x = 4
y = 4, @x = 5
=> 4
irb> o.x = 0
ArgumentError: new value must be > 0
from (irb):12
from :0
irb> o.x = "3"
ArgumentError: new value must be > 0
from (irb):13
from :0
irb> o.x
@x = 5
=> 5