W Smalltalk występują dwa terminy często występujące w treści metody: self
i yourself
.Jaka jest różnica między sobą i sobą w Smalltalk?
Jaka jest różnica między nimi?
W Smalltalk występują dwa terminy często występujące w treści metody: self
i yourself
.Jaka jest różnica między sobą i sobą w Smalltalk?
Jaka jest różnica między nimi?
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.
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