В Smalltalk есть два термина, часто встречающихся внутри тела метода: self
и yourself
.В чем разница между собой и собой в Smalltalk?
В чем разница между ними?
В Smalltalk есть два термина, часто встречающихся внутри тела метода: self
и yourself
.В чем разница между собой и собой в Smalltalk?
В чем разница между ними?
Зарезервированное слово 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
- это обычный метод, который существует только для удобства.
self
является синонимом объекта: конкретно получатель сообщения, вызывающего метод. Он используется внутри тела метода.
yourself
- это сообщение, которое вы можете отправить объекту, который возвращает получателя сообщения.
anObject yourself
anObject
.
yourself
часто используется в конце сообщение каскад в пределах метод корпус.
Если вы хотите, возвращаемое значение метода быть приемником, но окончательное сообщение в каскаде возвращает что-то другое, вы можете написать либо:
self aMessageReturningTheReceiver;
aMessageReturningTheArgument: anArgument .
^self
или
self aMessageReturningTheReceiver;
aMessageReturningTheArgument: anArgument;
yourself