¿Cuál es la diferencia entre ti mismo y tú mismo en Smalltalk?
pharo squeak (2)
La palabra reservada self
es una pseudo variable (no se le puede asignar) que se refiere al receptor actual del método en el que se usa. En el otro lado, hay un mensaje que puede enviar a cualquier objeto para obtener el mismo objeto.
La implementación de yourself
es
yourself
^self
lo que significa que el mensaje se comportará como acabo de explicar.
La razón por la que existe es para admitir el mensaje en cascada, donde lo coloca como el último mensaje para asegurarse de que la expresión resultante responda con el receptor:
^receiver
msg1;
msg2;
yourself
Si msg2
responde con algo diferente al receiver
, puede agregarse el mensaje para ignorar esa respuesta y devolver el receiver
. Por supuesto, podrías haber logrado el mismo resultado al escribir:
receiver
msg1;
msg2.
^receiver
Debido a la simplicidad de estos dos ejemplos, puede ser difícil entender cuál sería la ventaja. Sin embargo, considere que el receiver
no es una variable sino una expresión compleja, algo así.
^(self msg: arg1 arg: arg2)
msg1;
msg2;
yourself.
Sin utilizarte, deberías agregar un temporal para guardar el valor del receptor para lograr lo mismo:
| answer |
answer := self msg: arg1 arg: arg2.
answer
msg1;
msg2.
^answer
que es un poco más detallado.
Para resumir, self
es una palabra reservada que se refiere al receptor actual y yourself
es solo un método regular que está ahí solo por conveniencia.
En Smalltalk, a menudo se encuentran dos términos dentro de un cuerpo de método: self
yourself
y self
yourself
.
¿Cuál es la diferencia entre ellos?
self
es un sinónimo de un objeto: específicamente el receptor del mensaje que invocó el método. Se utiliza dentro del cuerpo de un método.
yourself
es un mensaje que puede enviar a un objeto, que devuelve el receptor del mensaje.
anObject yourself
devuelve anObject
.
yourself
se usa a menudo al final de una cascada de mensajes dentro de un cuerpo de método.
Cuando desee que el valor de retorno del método sea el receptor, pero el mensaje final en la cascada devuelva algo más, podría escribir:
self aMessageReturningTheReceiver;
aMessageReturningTheArgument: anArgument .
^self
o
self aMessageReturningTheReceiver;
aMessageReturningTheArgument: anArgument;
yourself