2015-11-22 32 views

Odpowiedz

24

Zarezerwowane słowo self jest zmienną pseudo (której nie można przypisać), która odnosi się do bieżącego odbiorcy metody, w której jest używana. Z drugiej strony yourself to wiadomość, którą można wysłać do dowolnego obiektu, aby uzyskać ten sam obiekt.

Realizacja yourself jest

yourself 
    ^self 

oznacza, że ​​wiadomość yourself będą zachowywać się tak po prostu wyjaśnić.

Powodem yourself istnieje jest wspieranie wiadomość kaskadowy, gdzie można umieścić go jako ostatniego komunikatu, aby upewnić się otrzymaną wyrażenie odpowie z odbiornikiem:

^receiver 
    msg1; 
    msg2; 
    yourself 

Jeśli msg2 może odpowiedzieć z czymś innym niż receiver można dodać wiadomość yourself, aby zignorować tę odpowiedź i zamiast tego zwrócić receiver. Oczywiście mogłeś osiągnąć ten sam rezultat pisząc:

receiver 
    msg1; 
    msg2. 
^receiver 

Ze względu na prostotę tych dwóch przykładach, może to być trudne do zrozumienia, co zaletą będzie. Należy jednak pamiętać, że receiver nie jest zmienną, ale złożonym wyrażeniem, coś w stylu.

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

Bez użycia yourself trzeba by dodać tymczasowy, aby zapisać wartość odbiornika, aby osiągnąć ten sam:

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

który jest trochę bardziej gadatliwy.

Podsumowując, self jest zastrzeżonym słowem, które odnosi się do bieżącego odbiornika, a yourself jest zwykłą metodą, która jest dostępna tylko dla wygody.

3

self jest synonimem dla obiektu: konkretnie odbiorcy komunikatu, który wywołał metodę. Jest używany w ciele metody.

yourself to wiadomość, którą można wysłać do obiektu, który zwraca odbiorcę wiadomości.

anObject yourself zwraca anObject.

yourself jest często używany na końcu kaskady komunikatów w treści metody.

Gdy chcesz Wartość zwracana przez metodę będzie odbiornik, ale ostateczny komunikat w kaskadzie zwraca coś innego, można napisać albo:

self aMessageReturningTheReceiver; 
     aMessageReturningTheArgument: anArgument . 
^self 

lub

self aMessageReturningTheReceiver; 
     aMessageReturningTheArgument: anArgument; 
     yourself