3

たとえば、次のようなことをしたいmyVal += theAmount- smalltalk でこれに似たものはありますか? 何も見つかりませんでした。

4

4 に答える 4

4

はい、ありますが、それは通常のメッセージ送信であり、特別な割り当てステートメントではありません。

Squeak には、たとえば FloatArray>>+= があり、別の配列の要素をレシーバーの要素に追加します。

| f |
f := #(1 2 3) asFloatArray.
f += #(4 5 6).
f
==> a FloatArray(5.0 7.0 9.0)

重要なのは、f が += メッセージを受信する前後で同じオブジェクトを参照していることです。その内容のみが変更されます。同様の方法で、独自のクラスに += を実装できます。

できないこと (*) は、他の言語のように += を使用して変数の値を置き換えることです。これは単なる通常のメッセージ送信であり、受信オブジェクトはそれに対して何か役に立つことがあります。

(*) コンパイラをハッキングすることなく。しつこい場合は何でもできますが、一般的にそうするのは良い考えではありません。

于 2013-07-06T18:34:22.657 に答える
4

理論的には、ある種のハックが存在する可能性があります。たとえば、クラスを定義して、その値をインスタンス変数NewNumberに格納できます。valueこれで定義できます

+= increment
    value := value + increment

:)

または単項メッセージでさえ

increment
    value := value + 1

それは ++ として機能します。しかし、Numbers のすべての魔法は、プリミティブ (メモリを直接操作できる VM 側の関数) の助けを借りて行われます。数値の状態を変更するプリミティブを定義し、それを += メソッドで呼び出すことは可能ですが、新しいプリミティブを追加するのは面倒で、現在のスタイル (常に戻り値を使用する場合) は、正直言ってとてもいいです。

于 2013-07-05T23:40:55.960 に答える