マーティンさんのように、これは割り当ての連鎖を壊すでしょう。
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
私が最初にこれを読んで"襲撃の答えが明らかになるので、そうではありません。譲渡方法の戻り値は通常無視されます。マーティンが言っていることは、「言語はあなたがそれをするのを許さず、もしそうであれば、あなたは連鎖された代入セマンティクスを破るだろう」ということです。 –