自我类型注释中这与自我的区别?

Zac*_*ach 132 scala

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

trait A { this: B => ... }
trait A { self: B => ... }
Run Code Online (Sandbox Code Playgroud)

使用"this"或"self"之间有什么真正的区别吗?你用的是什么名字是否重要?这有效吗?

trait A { foo: B => ... }
Run Code Online (Sandbox Code Playgroud)

Mar*_*sky 175

所有这三种形式是有效的,并有其效果B被假定为类型thisA.

前两个变种

trait A { self: B => ... }
trait A { foo: B => ... }
Run Code Online (Sandbox Code Playgroud)

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

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 )
      }
    })
  })
}
Run Code Online (Sandbox Code Playgroud)

第三个变种,

trait A { this: B => ... }
Run Code Online (Sandbox Code Playgroud)

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

  • @DmitryBespalov:是的,您可以在自键型注释中使用`with`关键字.例如`trait A {self:B with C => ...}` (13认同)
  • @Martin Odersky是否可以为两个或更多特征添加限制,例如`trait A {self:B,C => ...}`? (4认同)

Deb*_*ski 17

不同之处在于this始终引用最里面模板定义的对象.

表达式this可以出现在模板或复合类型的语句部分中.它代表由包含引用的最里面的模板或复合类型定义的对象.如果这是复合类型,则类型this为复合类型.如果它是一个类或对象定义与简单名称的模板Ç,这样做的类型相同的类型Ç.this.(斯卡拉参考文献§6.5)

所以,如果你调用你的自我类型foo,你仍然可以称之为this(当然,除非你在一个内部模板中,在这种情况下,this它将引用它定义的对象 - 除非你不给内部模板的自我类型相同的名称)但显然不是相反的方式.