たとえば、次のようなことをしたいmyVal += theAmount
- smalltalk でこれに似たものはありますか? 何も見つかりませんでした。
4 に答える
はい、ありますが、それは通常のメッセージ送信であり、特別な割り当てステートメントではありません。
Squeak には、たとえば FloatArray>>+= があり、別の配列の要素をレシーバーの要素に追加します。
| f |
f := #(1 2 3) asFloatArray.
f += #(4 5 6).
f
==> a FloatArray(5.0 7.0 9.0)
重要なのは、f が += メッセージを受信する前後で同じオブジェクトを参照していることです。その内容のみが変更されます。同様の方法で、独自のクラスに += を実装できます。
できないこと (*) は、他の言語のように += を使用して変数の値を置き換えることです。これは単なる通常のメッセージ送信であり、受信オブジェクトはそれに対して何か役に立つことがあります。
(*) コンパイラをハッキングすることなく。しつこい場合は何でもできますが、一般的にそうするのは良い考えではありません。
理論的には、ある種のハックが存在する可能性があります。たとえば、クラスを定義して、その値をインスタンス変数NewNumber
に格納できます。value
これで定義できます
+= increment
value := value + increment
:)
または単項メッセージでさえ
increment
value := value + 1
それは ++ として機能します。しかし、Numbers のすべての魔法は、プリミティブ (メモリを直接操作できる VM 側の関数) の助けを借りて行われます。数値の状態を変更するプリミティブを定義し、それを += メソッドで呼び出すことは可能ですが、新しいプリミティブを追加するのは面倒で、現在のスタイル (常に戻り値を使用する場合) は、正直言ってとてもいいです。