In Smalltalk, ci sono due termini che si trovano spesso all'interno di un corpo del metodo: self
e yourself
.Qual è la differenza tra te e te stesso in Smalltalk?
Qual è la differenza tra loro?
In Smalltalk, ci sono due termini che si trovano spesso all'interno di un corpo del metodo: self
e yourself
.Qual è la differenza tra te e te stesso in Smalltalk?
Qual è la differenza tra loro?
La parola riservata self
è una pseudo variabile (non è possibile assegnarvi) che si riferisce al ricevitore corrente del metodo in cui viene utilizzato. Dall'altro lato, yourself
è un messaggio che è possibile inviare a qualsiasi oggetto per ottenere lo stesso oggetto.
L'attuazione di yourself
è
yourself
^self
il che significa che il messaggio yourself
si comporterà come ho appena spiegato.
Il motivo per cui yourself
esiste è quello di sostenere il messaggio a cascata, dove lo metti come l'ultimo messaggio per assicurarsi che l'espressione risultante risponderà con il ricevitore:
^receiver
msg1;
msg2;
yourself
Se msg2
potrebbe rispondere con qualcosa di diverso da il receiver
è possibile aggiungere il messaggio yourself
per ignorare quella risposta e restituire invece receiver
. Naturalmente si potrebbe aver raggiunto lo stesso risultato scrivendo:
receiver
msg1;
msg2.
^receiver
Grazie alla semplicità di questi due esempi, potrebbe essere difficile capire che cosa il vantaggio sarebbe. Tuttavia, considera che receiver
non è una variabile ma un'espressione complessa, qualcosa di simile.
^(self msg: arg1 arg: arg2)
msg1;
msg2;
yourself.
Senza usare yourself
si dovrà aggiungere una temporanea per salvare il valore del ricevitore per ottenere lo stesso:
| answer |
answer := self msg: arg1 arg: arg2.
answer
msg1;
msg2.
^answer
che è un po 'più dettagliato.
Per riassumere, self
è una parola riservata che fa riferimento al ricevitore corrente e yourself
è solo un metodo normale che è lì solo per comodità.
self
è un sinonimo di un oggetto: in particolare il destinatario del messaggio che ha invocato il metodo. È usato all'interno del corpo di un metodo.
yourself
è un messaggio che è possibile inviare a un oggetto, che restituisce il destinatario del messaggio.
anObject yourself
restituisce anObject
.
yourself
viene spesso utilizzato alla fine di una cascata di messaggi all'interno di un corpo del metodo.
Quando si desidera che il valore restituito dal metodo di essere il destinatario, ma il messaggio finale nella cascata restituisce qualcosa di diverso, si potrebbe scrivere uno:
self aMessageReturningTheReceiver;
aMessageReturningTheArgument: anArgument .
^self
o
self aMessageReturningTheReceiver;
aMessageReturningTheArgument: anArgument;
yourself