В Smalltalk есть два слагаемых, которые часто встречаются внутри тела метода: self и yourself.
В чем разница между ними?
В Smalltalk есть два слагаемых, которые часто встречаются внутри тела метода: self и yourself.
В чем разница между ними?
Зарезервированное слово 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