Smalltalk では、メソッド本体内に と という 2 つの用語がよく見られself
ますyourself
。
それらの違いは何ですか?
Smalltalk では、メソッド本体内に と という 2 つの用語がよく見られself
ますyourself
。
それらの違いは何ですか?
予約語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
あり、便宜上存在する通常のメソッドです。
self
オブジェクトのシノニムです。具体的には、メソッドを呼び出したメッセージの受信者です。メソッドの本体内で使用されます。
yourself
オブジェクトに送信できるメッセージで、メッセージの受信者を返します。
anObject yourself
戻りますanObject
。
yourself
メソッド本体内のメッセージカスケードの最後でよく使用されます。
メソッドからの戻り値をレシーバーにしたいが、カスケードの最終メッセージが別のものを返す場合は、次のいずれかを記述できます。
self aMessageReturningTheReceiver;
aMessageReturningTheArgument: anArgument .
^self
また
self aMessageReturningTheReceiver;
aMessageReturningTheArgument: anArgument;
yourself