【问题标题】:Difference between this and self in self-type annotations?自类型注释中 this 和 self 的区别?
【发布时间】:2010-10-25 17:47:01
【问题描述】:

在各种 Scala 文献中,我看到一些使用“this”的自我类型注释和其他使用“self”的注释:

trait A { this: B => ... }
trait A { self: B => ... }

使用“this”或“self”有什么真正的区别吗?你用什么名字有关系吗?这同样有效吗?

trait A { foo: B => ... }

【问题讨论】:

    标签: scala


    【解决方案1】:

    这三种形式都是有效的,并且具有将B 假定为A 类中this 的类型的效果。

    前两个变种

    trait A { self: B => ... }
    trait A { foo: B => ... }
    

    在特征A 中引入self(分别为foo)作为this 的别名。这对于从内部类访问 this 引用很有用。 IE。然后,当从嵌套在其中的类访问特征 Athis 引用时,您可以使用 self 而不是 A.this。示例:

    class MyFrame extends JFrame { frame =>    
      getContentPane().add( new JButton( "Hide" ) {
        addActionListener( new ActionListener {
          def actionPerformed( e: ActionEvent ) {
            // this.setVisible( false ) --> shadowed by JButton!
            frame.setVisible( false )
          }
        })
      })
    }
    

    第三个变种,

    trait A { this: B => ... }
    

    没有为this 引入别名;它只是设置自我类型。

    【讨论】:

    • 我看待自我类型的方式是,特征声明自己采用某种类型并返回代码块,例如富:B => {...}。现在这些卷曲当然被省略了。有趣的是,您可以在代码的任何范围内使用对象名称而不是“this”,尽管 [我们一直在 javascript 中做的事情]
    • @Martin Odersky 是否可以为两个或多个特征添加限制,例如 trait A { self: B, C => ... }
    • @DmitryBespalov:是的,您可以在自键入注释中使用with 关键字。例如trait A { self: B with C => ... }
    • 顺便说一句,为简单起见,您也可以为非别名情况使用_: B =>
    【解决方案2】:

    区别在于this总是引用最内层模板定义的对象。

    表达式this 可以出现在模板或复合类型的语句部分。它代表由包含引用的最内层模板或复合类型定义的对象。如果这是一个复合类型,this 的类型就是那个复合类型。如果是简单名称​​C的类或对象定义的模板,则this的类型与C的类型相同。this。 (Scala 参考§6.5)

    因此,如果您将自己的类型称为foo,您仍然可以将其称为this(当然,除非您在内部模板中,在这种情况下this 将引用定义的对象通过它 - 除非你不给内部模板的自我类型相同的名称)但显然不是相反。

    【讨论】:

      猜你喜欢
      • 2013-05-28
      • 2011-01-14
      • 2010-12-29
      • 2015-08-29
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      相关资源
      最近更新 更多