2015-11-22 3 views

ответ

24

Зарезервированное слово self является псевдо переменной (вы не можете назначить ему), которая ссылается на текущий приемник метода, в котором он используется. С другой стороны, yourself - это сообщение, которое вы можете отправить любому объекту, чтобы получить тот же самый объект.

Реализация yourself является

yourself 
    ^self 

означает, что сообщение yourself будет вести себя, как я только что объяснил.

Причина yourself существует, чтобы поддерживать сообщение каскадирование, где вы положили его в качестве последнего сообщения, чтобы убедиться, что полученное выражение будет отвечать с приемником:

^receiver 
    msg1; 
    msg2; 
    yourself 

Если msg2 может ответить на что-то другое из receiver вы можете добавить сообщение yourself, чтобы проигнорировать этот ответ и вернуть receiver. Конечно, вы могли бы добиться того же результата, написав:

receiver 
    msg1; 
    msg2. 
^receiver 

Из-за простоты этих двух примеров, это может быть трудно понять, что такое преимущество будет. Однако учтите, что receiver не является переменной, а сложным выражением, что-то вроде.

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

Без использования yourself вы бы добавить временный сохранить значение приемника для достижения той же:

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

, который является немного более многословным.

Подводя итог, self является зарезервированным словом, которое относится к текущему приемнику, а yourself - это обычный метод, который существует только для удобства.

3

self является синонимом объекта: конкретно получатель сообщения, вызывающего метод. Он используется внутри тела метода.

yourself - это сообщение, которое вы можете отправить объекту, который возвращает получателя сообщения.

anObject yourselfanObject.

yourself часто используется в конце сообщение каскад в пределах метод корпус.

Если вы хотите, возвращаемое значение метода быть приемником, но окончательное сообщение в каскаде возвращает что-то другое, вы можете написать либо:

self aMessageReturningTheReceiver; 
     aMessageReturningTheArgument: anArgument . 
^self 

или

self aMessageReturningTheReceiver; 
     aMessageReturningTheArgument: anArgument; 
     yourself