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

Eua*_*n M 18 smalltalk visualworks squeak pharo amber-smalltalk

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

他们之间有什么区别?

Lea*_*lia 28

保留字self是一个伪变量(不能分配给它),它指的是使用它的方法的当前接收者.另一方面yourself是您可以发送到任何对象以获取该相同对象的消息.

执行yourself

yourself
    ^self
Run Code Online (Sandbox Code Playgroud)

这意味着消息的yourself行为与我刚才解释的一样.

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

^receiver
   msg1;
   msg2;
   yourself
Run Code Online (Sandbox Code Playgroud)

如果msg2可以回答与receiver您不同的内容,您可以附加yourself消息以忽略该答案并返回receiver.当然,您可以通过编写来获得相同的结果:

receiver
   msg1;
   msg2.
^receiver
Run Code Online (Sandbox Code Playgroud)

由于这两个例子的简单性,可能很难理解其优势.但是,请考虑这receiver不是一个变量,而是一个复杂的表达式,例如.

^(self msg: arg1 arg: arg2)
   msg1;
   msg2;
   yourself.
Run Code Online (Sandbox Code Playgroud)

没有使用yourself你将不得不添加一个临时保存接收器的值来实现相同的:

| answer |
answer := self msg: arg1 arg: arg2.
answer
   msg1;
   msg2.
^answer
Run Code Online (Sandbox Code Playgroud)

这有点多啰嗦.

总而言之,self是一个保留字,它指的是当前的接收器,并且yourself只是为了方便起见的常规方法.


Eua*_*n M 5

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

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

anObject yourself返回anObject

yourself通常在方法主体内的消息级联结束时使用。

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

self aMessageReturningTheReceiver;
      aMessageReturningTheArgument: anArgument .
^self
Run Code Online (Sandbox Code Playgroud)

或者

self aMessageReturningTheReceiver;
      aMessageReturningTheArgument: anArgument;
      yourself
Run Code Online (Sandbox Code Playgroud)