在各种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被假定为类型this类A.
前两个变种
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; 它只是设置自我类型.
Deb*_*ski 17
不同之处在于this始终引用最里面模板定义的对象.
表达式
this可以出现在模板或复合类型的语句部分中.它代表由包含引用的最里面的模板或复合类型定义的对象.如果这是复合类型,则类型this为复合类型.如果它是一个类或对象定义与简单名称的模板Ç,这样做的类型相同的类型Ç.this.(斯卡拉参考文献§6.5)
所以,如果你调用你的自我类型foo,你仍然可以称之为this(当然,除非你在一个内部模板中,在这种情况下,this它将引用它定义的对象 - 除非你不给内部模板的自我类型相同的名称)但显然不是相反的方式.