2015-11-22 1 views

Répondre

24

Le mot réservé self est une pseudo-variable (vous ne pouvez pas lui affecter) qui fait référence au récepteur actuel de la méthode où il est utilisé. De l'autre côté, yourself est un message que vous pouvez envoyer à n'importe quel objet pour obtenir le même objet.

La mise en œuvre de yourself est

yourself 
    ^self 

ce qui signifie que le message yourself se comportera comme je viens de vous expliquer.

La raison pour laquelle yourself existe est de soutenir en cascade de messages, où vous mettez comme le dernier message pour vous assurer que l'expression résultante répondra avec le récepteur:

^receiver 
    msg1; 
    msg2; 
    yourself 

Si msg2 pourrait répondre avec quelque chose de différent le receiver vous pouvez ajouter le message yourself pour ignorer cette réponse et renvoyer receiver à la place. Bien sûr, vous auriez pu obtenir le même résultat en écrivant:

receiver 
    msg1; 
    msg2. 
^receiver 

En raison de la simplicité de ces deux exemples, il pourrait être difficile de comprendre ce que l'avantage serait. Cependant, considérons que receiver n'est pas une variable mais une expression complexe, quelque chose comme.

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

Sans utiliser yourself vous devez ajouter temporaire pour sauvegarder la valeur du récepteur pour obtenir le même:

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

qui est un peu plus bavard.

Pour résumer, self est un mot réservé qui se réfère au récepteur actuel et yourself est juste une méthode régulière qui est là juste pour plus de commodité.

3

self est un synonyme d'un objet: spécifiquement le destinataire du message qui a invoqué la Il est utilisé dans le corps d'une méthode.

yourself est un message que vous pouvez envoyer à un objet, qui renvoie le destinataire du message.

anObject yourself renvoie anObject.

yourself est souvent utilisé à la fin d'une cascade de messages dans un corps de méthode.

Lorsque vous voulez la valeur de retour de la méthode pour le récepteur, mais le message final de la cascade retourne quelque chose d'autre, vous pouvez écrire soit:

self aMessageReturningTheReceiver; 
     aMessageReturningTheArgument: anArgument . 
^self 

ou

self aMessageReturningTheReceiver; 
     aMessageReturningTheArgument: anArgument; 
     yourself