【问题标题】:What is the difference between self and yourself in Smalltalk?Smalltalk中的self和self有什么区别?
【发布时间】:2016-02-24 07:51:15
【问题描述】:

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

它们有什么区别?

【问题讨论】:

    标签: smalltalk pharo squeak visualworks amber-smalltalk


    【解决方案1】:

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

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

    anObject yourself 返回anObject

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

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

    self aMessageReturningTheReceiver;
          aMessageReturningTheArgument: anArgument .
    ^self
    

    self aMessageReturningTheReceiver;
          aMessageReturningTheArgument: anArgument;
          yourself
    

    【讨论】:

      【解决方案2】:

      保留字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 只是一个常规方法,只是为了方便。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-08
        相关资源
        最近更新 更多