24

Smalltalk では、メソッド本体内に と という 2 つの用語がよく見られselfますyourself

それらの違いは何ですか?

4

2 に答える 2

33

予約語selfは、それが使用されているメソッドの現在のレシーバーを参照する疑似変数 (代入はできません) です。反対側にyourselfは、同じオブジェクトを取得するために任意のオブジェクトに送信できるメッセージがあります。

の実装yourself

yourself
    ^self

つまり、メッセージyourselfは今説明したように動作します。

存在する理由yourselfは、メッセージのカスケードをサポートするためです。最後のメッセージとして配置し、結果の式が受信者に確実に応答するようにします。

^receiver
   msg1;
   msg2;
   yourself

msg2とは異なる回答をする可能性がある場合receiverは、メッセージを追加してyourselfその回答を無視し、receiver代わりに返すことができます。もちろん、次のように記述しても同じ結果が得られます。

receiver
   msg1;
   msg2.
^receiver

これら 2 つの例は単純であるため、どのような利点があるかを理解するのは難しいかもしれません。ただし、それreceiverは変数ではなく、複雑な式であると考えてください。

^(self msg: arg1 arg: arg2)
   msg1;
   msg2;
   yourself.

使用しyourselfないと、レシーバーの値を保存して同じことを達成するために一時的なものを追加する必要があります。

| answer |
answer := self msg: arg1 arg: arg2.
answer
   msg1;
   msg2.
^answer

これはもう少し冗長です。

要約selfすると、現在のレシーバーを参照する予約語でyourselfあり、便宜上存在する通常のメソッドです。

于 2015-11-22T00:23:25.050 に答える
5

selfオブジェクトのシノニムです。具体的には、メソッドを呼び出したメッセージの受信者です。メソッドの本体内で使用されます。

yourselfオブジェクトに送信できるメッセージで、メッセージの受信者を返します。

anObject yourself戻りますanObject

yourselfメソッド本体内のメッセージカスケードの最後でよく使用されます。

メソッドからの戻り値をレシーバーにしたいが、カスケードの最終メッセージが別のものを返す場合は、次のいずれかを記述できます。

self aMessageReturningTheReceiver;
      aMessageReturningTheArgument: anArgument .
^self

また

self aMessageReturningTheReceiver;
      aMessageReturningTheArgument: anArgument;
      yourself
于 2015-11-22T12:09:38.770 に答える