Smalltalk中self和yourself有什么区别?

What is the difference between self and yourself in Smalltalk?

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

它们有什么区别?

保留字self是一个伪变量(不能赋值给它),它指的是使用它的方法的当前接收者。在另一边 yourself 是一条消息,您可以将其发送到任何对象以获取完全相同的对象。

yourself的实现是

yourself
    ^self

意味着消息 yourself 将按照我刚才解释的方式运行。

存在yourself的原因是为了支持消息级联,将其作为最后一条消息放置,以确保生成的表达式将与接收者一起回答:

^receiver
   msg1;
   msg2;
   yourself

如果 msg2 的回答可能与 receiver 不同,您可以附加 yourself 消息以忽略该回答,并改为 return 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 只是为了方便而存在的常规方法。

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

yourself 是可以发送给对象的消息,return 是消息的接收者。

anObject yourself returns anObject.

yourself 通常用在方法体内 消息级联 的末尾。

当您希望方法中的 return 值作为接收者,但级联中的最终消息 return 是其他内容时,您可以这样写:

self aMessageReturningTheReceiver;
      aMessageReturningTheArgument: anArgument .
^self

self aMessageReturningTheReceiver;
      aMessageReturningTheArgument: anArgument;
      yourself