在各种Scala文献中,我看到一些使用“this”的自我类型注释和其他使用“self”的注释:
trait A { this: B => ... }
trait A { self: B => ... }
使用“this”或“self”之间有什么真正的区别吗?你用的是什么名字是否重要?这有效吗?
trait A { foo: B => ... }
答案 0 :(得分:173)
这三种表单都有效,并且B
被假定为类this
中A
的类型。
前两个变种
trait A { self: B => ... }
trait A { foo: B => ... }
将self
(分别为foo
)作为特征this
中A
的别名。这对于从内部类访问this
引用很有用。即然后,当您从嵌套在其中的类中访问特征self
的{{1}}引用时,可以使用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 )
}
})
})
}
不会为trait A { this: B => ... }
引入别名;它只是设置自我类型。
答案 1 :(得分:17)
不同之处在于this
始终引用最里面模板定义的对象。
表达式
this
可以出现在模板或复合类型的语句部分中。它代表由包含引用的最里面的模板或复合类型定义的对象。如果这是复合类型,this
的类型就是复合类型。如果它是具有简单名称 C 的类或对象定义的模板,则其类型与 C 。this
的类型相同。 (斯卡拉参考文献§6.5)
因此,如果您调用自我类型foo
,您仍然可以将其称为this
(当然,除非您在内部模板中this
将引用它定义的对象 - 除非你没有给内部模板的自我类型赋予相同的名称),但显然不是相反的。