2015-11-22 10 views

答えて

24

予約語selfは、使用されているメソッドの現在の受信者を参照する擬似変数です(割り当てることはできません)。反対側では、yourselfは、どのオブジェクトにでも同じオブジェクトを取得できるメッセージです。

yourselfの実装では、私はちょうど説明したようにメッセージyourselfが振る舞うことを意味

yourself 
    ^self 

です。異なる何かを答えるかもしれません

^receiver 
    msg1; 
    msg2; 
    yourself 

msg2場合:

yourselfが存在する理由は、あなたが得られた発現は、受信機と答えることを確認するために最後のメッセージとしてそれをどこに置いたか、メッセージのカスケードをサポートすることですreceiveryourselfメッセージを追加してその回答を無視し、代わりにreceiverを返すことができます。もちろん、あなたが書き込むことによって同じ結果を達成している可能性が:ので、これらの二つの例の単純さの

receiver 
    msg1; 
    msg2. 
^receiver 

、利点がどうなるかを理解するのは難しいかもしれません。しかし、receiverは変数ではなく複雑な式であると考えてください。

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

yourselfを使用せずに、あなたは同じことを達成するための受信機の値を保存するために一時的に追加する必要があります:少し冗長である

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

を。

要約すると、selfは現在の受信者を参照する予約語であり、yourselfは単なる便宜のための通常の方法です。

3

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

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

anObject yourselfanObjectを返します。

yourselfは、メソッド本体内でメッセージカスケードの末尾によく使用されます。

あなたはメソッドからの戻り値は、受信機になりたいが、カスケード中の最後のメッセージは何か他のものを返し、あなたはどちらか書くことができる:

self aMessageReturningTheReceiver; 
     aMessageReturningTheArgument: anArgument . 
^self 

または

self aMessageReturningTheReceiver; 
     aMessageReturningTheArgument: anArgument; 
     yourself 
関連する問題