【发布时间】:2016-02-24 07:51:15
【问题描述】:
在 Smalltalk 中,方法主体中经常出现两个术语:self 和 yourself。
它们有什么区别?
【问题讨论】:
标签: smalltalk pharo squeak visualworks amber-smalltalk
在 Smalltalk 中,方法主体中经常出现两个术语:self 和 yourself。
它们有什么区别?
【问题讨论】:
标签: smalltalk pharo squeak visualworks amber-smalltalk
self 是对象的同义词:特别是调用该方法的消息的接收者。它在方法体内使用。
yourself 是您可以发送给对象的消息,该对象返回消息的接收者。
anObject yourself 返回anObject。
yourself 通常用在方法体中消息级联的末尾。
当您希望方法的返回值成为接收者,但级联中的最终消息返回其他内容时,您可以这样写:
self aMessageReturningTheReceiver;
aMessageReturningTheArgument: anArgument .
^self
或
self aMessageReturningTheReceiver;
aMessageReturningTheArgument: anArgument;
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,您将不得不添加一个临时来保存接收者的值以实现相同的效果:
| answer |
answer := self msg: arg1 arg: arg2.
answer
msg1;
msg2.
^answer
这有点冗长。
总而言之,self 是一个保留字,表示当前接收者,yourself 只是一个常规方法,只是为了方便。
【讨论】: