2015-11-22 7 views

Antwort

24

Das reservierte Wort self ist eine Pseudovariable (kann nicht zugewiesen werden), die sich auf den aktuellen Empfänger der Methode bezieht, in der es verwendet wird. Auf der anderen Seite yourself ist eine Nachricht, die Sie an jedes Objekt senden können, um das gleiche Objekt zu erhalten.

Die Implementierung von yourself ist

yourself 
    ^self 

was bedeutet, dass die Nachricht yourself verhält sich wie ich gerade erklärt.

Der Grund, warum yourself vorhanden ist Nachricht Kaskadierung zu unterstützen, wo Sie es als die letzte Nachricht setzen der resultierende Ausdruck mit dem Empfänger, um sicherzustellen, beantworten:

^receiver 
    msg1; 
    msg2; 
    yourself 

Wenn msg2 könnte mit etwas beantworten anders receiver können Sie die yourself Nachricht anhängen, um diese Antwort zu ignorieren und stattdessen receiver zurückgeben. Natürlich können Sie das gleiche Ergebnis durch Schreiben erreicht haben könnte:

receiver 
    msg1; 
    msg2. 
^receiver 

Wegen der Einfachheit dieser beiden Beispiele, könnte es schwer zu verstehen, was der Vorteil wäre. Beachten Sie jedoch, dass receiver keine Variable, sondern ein komplexer Ausdruck ist.

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

Ohne yourself verwenden würden Sie eine temporäre hinzufügen, um den Wert des Empfängers zu speichern, das gleiche zu erreichen:

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

die ein wenig ausführlicher ist.

Zusammenfassend ist self ein reserviertes Wort, das sich auf den aktuellen Empfänger bezieht und yourself ist nur eine normale Methode, die nur aus Bequemlichkeit da ist.

3

self ist ein Synonym für ein Objekt: speziell der Empfänger der Nachricht, die die Methode aufgerufen hat. Es wird innerhalb des Körpers einer Methode verwendet.

yourself ist eine Nachricht, die Sie an ein Objekt senden können, das den Empfänger der Nachricht zurückgibt.

anObject yourself gibt anObject zurück.

yourself wird oft am Ende einer Nachricht Kaskade innerhalb einer Methode Körper verwendet.

Wenn Sie den Rückgabewert der Methode soll der Empfänger sein, aber die letzte Nachricht in der Kaskade zurückgibt etwas anderes, könnten Sie schreiben entweder:

self aMessageReturningTheReceiver; 
     aMessageReturningTheArgument: anArgument . 
^self 

oder

self aMessageReturningTheReceiver; 
     aMessageReturningTheArgument: anArgument; 
     yourself 
Verwandte Themen