マーティンが言うように、これは割り当ての連鎖を壊します。
ルビー代入メソッドが機能するように定義される方法は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