2015-11-22 23 views

risposta

24

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à.

3

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