それはclass.property = xはX以外の何かを返すことは可能ですか?
-
22-08-2019 - |
質問
のは、私はRubyのクラスがあるとしましょう。
class MyClass
def self.property
return "someVal"
end
def self.property=(newVal)
# do something to set "property"
success = true
return success # success is a boolean
end
end
私が試してみてMyClass.property=x
を行う場合は、、全体の文の戻り値は常にXです。それはブール「成功」の値を返すためにインスピレーション/ Cベースの言語の多くのコンベンションである - ?それは可能であるRubyで「構文に等しい」を使用してセッターのためにこれを行うには、
さらに - これが不可能な場合は、なぜいけないのでしょうか?任意の考えられる欠点は、「等しいセッター」操作が値を返すことが可能にありますか?
解決
一つの欠点は、あなたがチェーンの割り当てのセマンティクスを破るだろうということです。
$ irb
irb(main):001:0> x = y = 3
=> 3
irb(main):002:0> p x
3
=> nil
irb(main):003:0> p y
3
=> nil
irb(main):004:0>
考えてみます:
x = MyClass.property = 3
これは、あなたが(右結合性)を期待していたとして働いていた場合は、次にx
はtrue
を取るだろう。それはあなたのインターフェイスを使用している人々のために驚くべきことで、典型的なセマンティクスに使用することができます。
また、私は例えば、並列割り当てについて考えました。
x, y = 1, 2
どうやらその式の戻り値は、実装固有ののです...私は私の推測しますパラレル割り当てをチェーンされません。)
ニース質問!
他のヒント
のように、これは割り当て連鎖を破るます。
ルビー割り当て方法が動作するように定義されている方法は、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
私は、Rubyの専門家ではないが、私は、私は怖いような場合のためにノーと言うだろう。プロパティのセッターは、結果コードを返すような任意の副作用を持っていない、プライベートフィールドの値を設定するためだけに存在します。
あなたはその機能が必要な場合は、セッターを忘れて、プロパティを設定しようとするとブール値を返しますTrySetProperty
か何かと呼ばれる新しいメソッドを記述します。