smalltalk pharo squeak visualworks amber-smalltalk

¿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