В чем разница между собой и собой в Smalltalk?

В Smalltalk есть два слагаемых, которые часто встречаются внутри тела метода: self и yourself.

В чем разница между ними?

Ответы

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

Ответ 2

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

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

anObject yourself возвращает anObject.

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

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

self aMessageReturningTheReceiver;
      aMessageReturningTheArgument: anArgument .
^self

или

self aMessageReturningTheReceiver;
      aMessageReturningTheArgument: anArgument;
      yourself