Smalltalk中自我和你自己有什么区别?

时间:2015-11-22 00:09:37

标签: smalltalk pharo squeak visualworks amber-smalltalk

在Smalltalk中,方法体中经常会出现两个术语:selfyourself

他们之间有什么区别?

2 个答案:

答案 0 :(得分:26)

保留字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只是为方便起见的常规方法。

答案 1 :(得分:4)

self是对象的同义词:特别是调用该方法的消息的接收者。它在方法体内使用。

yourself是一条可以发送给对象的消息,它返回消息的接收者。

anObject yourself返回anObject

yourself通常用于方法体中消息级联的末尾。

如果希望方法的返回值为接收者,但级联中的最后一条消息返回其他内容,则可以编写:

self aMessageReturningTheReceiver;
      aMessageReturningTheArgument: anArgument .
^self

self aMessageReturningTheReceiver;
      aMessageReturningTheArgument: anArgument;
      yourself