在Smalltalk中,自我和你自己有什么不同?

在Smalltalk中,自我和你自己有什么不同?,smalltalk,pharo,squeak,visualworks,amber-smalltalk,Smalltalk,Pharo,Squeak,Visualworks,Amber Smalltalk,在Smalltalk中,有两个术语经常出现在方法体中:self和yourself 它们之间的区别是什么?保留字self是一个伪变量(您不能分配给它),它指的是使用它的方法的当前接收器。另一方面,您自己是一条消息,您可以发送到任何对象以获取相同的对象 yourself的实现是 yourself ^self 这意味着消息您自己的行为将与我刚才解释的一样 yourself存在的原因是为了支持消息级联,将其作为最后一条消息,以确保生成的表达式将与接收者应答: ^receiver msg1

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


它们之间的区别是什么?

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

yourself
的实现是

yourself
    ^self
这意味着消息
您自己
的行为将与我刚才解释的一样

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

^receiver
   msg1;
   msg2;
   yourself
如果
msg2
可能使用与
receiver
不同的回答,您可以附加
yourself
消息来忽略该回答,并返回
receiver
。当然,你也可以通过写作达到同样的效果:

receiver
   msg1;
   msg2.
^receiver
由于这两个示例的简单性,可能很难理解其优势是什么。但是,考虑<代码>接收器<代码>不是一个变量,而是一个复杂的表达式,类似于

^(self msg: arg1 arg: arg2)
   msg1;
   msg2;
   yourself.
如果不使用
您自己
,您必须添加一个临时值来保存接收器的值,以实现相同的效果:

| answer |
answer := self msg: arg1 arg: arg2.
answer
   msg1;
   msg2.
^answer
这有点冗长


总之,
self
是指当前接收者的保留字,
yourself
只是为了方便而存在的常规方法。

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

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

anObject yourself
返回
anObject

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

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

self aMessageReturningTheReceiver;
      aMessageReturningTheArgument: anArgument .
^self

self aMessageReturningTheReceiver;
      aMessageReturningTheArgument: anArgument;
      yourself