4

メソッドを持つクラスがあります:

def value=(valueIN)
  some code
end

そして、これはまさに私がしたいことをします:

(class instance).value="new data"

このクラスの をオーバーライドするだけで=よいので、する必要はありませんvalue=。まず、私は試しました:

def =(valueIN)
  some code
end

しかし、これは私にエラーを与えたので、私は試しました:

def self=(valueIN)
  some code
end

これによりエラーは発生しませんが、次の場合は機能しません。

(class instance)="new data"

課題はクラスレベルで変更できないものですか? これができなくても大したことではありませんが、何か基本的なことが欠けていることを願っていました。

4

5 に答える 5

4

=上書きできるRubyの演算子ではありません。Rubyが(私たちと一緒に)演じるトリックは、

self.value = "Me"
self.value= "You"
self.value=("He")

はすべて同じように解釈されるため、最も好きなバージョンを自由に使用できます。これらはすべてメソッド呼び出しであるためvalue=、1 つの引数でどのように動作するかを定義または上書きできます。

オブジェクトの属性を割り当てるためだけに使うのはイディオムですが、Ruby では好きな場所で使用できます。

そのため、演算子を上書きする機会はありません=(これは良い考えだと思います)。

于 2013-03-13T06:16:06.113 に答える
4

申し訳ありませんが、これはできません。を記述するときはfoo = bar、メソッドを呼び出すのではなく、変数を割り当てるだけです。something.foo = barメソッド呼び出しに脱糖するだけで、他の場所と同じように、そのメソッド呼び出しの受信者はドットの前のものです。

于 2013-03-13T06:16:24.297 に答える
1

クラスレベルの値にsetterメソッドを提供しようとしている場合は、次のようなものを使用して提供できます。

class MyClass
  def self.my_class_attribute=(value)
    @my_class_attribute = value
  end
end

次に、次のように割り当てることができます。

MyClass.my_class_attribute = "new value"

これにより、のメソッドが呼び出さ.my_class_attribute=MyClassます。

于 2013-03-13T06:17:48.623 に答える
1

あなたが話していることをする方法はありません。の値は変更できないselfため、のクラスレベルのオーバーライドはありません=

しかし、なぜあなたがそれをしたいのか完全にはわかりません。役立つ可能性のあるシナリオでは、クラスの新しいインスタンスを作成する必要があります。オブジェクトを(または何かを介し.dupて)複製して新しいオブジェクトを変更するか、オブジェクトをコピーして新しい、おそらく変更されたインスタンスを返すカスタムクラスメソッドを作成することで、同様のことを実行できます。私は推測していますが、良い例を考えることはできません。

于 2013-03-13T06:18:41.837 に答える
1

=コンテキストに応じて、2 つの方法のいずれかで解釈されます。

  • フォームのメソッドの一部foo=
  • 変数代入演算子

の形式で独自のメソッドを定義できます。foo=この場合、=の前にアルファベットが付きますが、変数代入演算子を再定義することはできません=

于 2013-03-13T06:16:35.847 に答える