24

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

它们之间有什么区别?

4

2 回答 2

33

保留字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只是为了方便而存在的常规方法。

于 2015-11-22T00:23:25.050 回答
5

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

yourself是您可以发送到对象的消息,该对象返回消息的接收者。

anObject yourself返回anObject

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

当您希望方法的返回值成为接收者,但级联中的最终消息返回其他内容时,您可以编写:

self aMessageReturningTheReceiver;
      aMessageReturningTheArgument: anArgument .
^self

或者

self aMessageReturningTheReceiver;
      aMessageReturningTheArgument: anArgument;
      yourself
于 2015-11-22T12:09:38.770 回答