Ответ 1
Зарезервированное слово 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
- это обычный метод, который существует только для удобства.