Smalltalk中self和yourself有什么区别?

25
在Smalltalk中,方法体内经常出现两个术语:selfyourself
它们之间有什么区别?
2个回答

38

保留字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,您将需要添加一个临时变量来保存接收器的值,以实现相同的效果:

不使用yourself可以这样写:

| answer |
answer := self msg: arg1 arg: arg2.
answer
   msg1;
   msg2.
^answer

说得详细一点,self是一个保留的关键字,代表当前接收者,而yourself只是一个为了方便而存在的普通方法。


6

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

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

anObject yourself返回anObject

yourself经常用于方法体内的消息级联的末尾。

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

self aMessageReturningTheReceiver;
      aMessageReturningTheArgument: anArgument .
^self

或者
self aMessageReturningTheReceiver;
      aMessageReturningTheArgument: anArgument;
      yourself

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接