それはclass.property = xはX以外の何かを返すことは可能ですか?

StackOverflow https://stackoverflow.com/questions/708618

  •  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
これは、あなたが(右結合性)を期待していたとして働いていた場合は、

次にxtrueを取るだろう。それはあなたのインターフェイスを使用している人々のために驚くべきことで、典型的なセマンティクスに使用することができます。

また、私は例えば、並列割り当てについて考えました。

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か何かと呼ばれる新しいメソッドを記述します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top