在Smalltalk中,方法体内经常出现两个术语:
它们之间有什么区别?
self
和 yourself
。它们之间有什么区别?
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
,您将需要添加一个临时变量来保存接收器的值,以实现相同的效果:
不使用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