我理解显式类型的自引用的用途:
trait T {
self : T2 =>
...
}
在代码中,
self
是 this
的别名,但它的类型更精确为 T with T2
。现在,我已经在代码中看到这个:
trait T {
self =>
...
}
也就是说,一个没有额外类型信息的显式自引用。在这种配置下,是否存在任何情况使得
self
不仅仅是this
的别名?它是this
的别名。
你的第一个示例有助于确保trait已经混入到适当的类型中,并使这些方法可用。
当您有命名冲突的内部类时,第二个示例很有用,以便使外部作用域可见。例如:
trait U {
self =>
val name = "outer"
val b = new AnyRef {
val name = "inner"
println(name)
println(this.name)
println(self.name)
}
}
然后new AnyRef with U
输出
inner
inner
outer
"self"不是一个特殊的关键字 - 你可以使用"bananas =>"或任何你喜欢的词语,但通常遵循惯例使用"self"。
这在Swing中经常出现,因为你会创建许多内部类(滚动窗格内的文本框等),这些内部类通常具有与外部类相同名称的许多方法。
self
是指 this
的另一种说法。this
将是内部类,而self
将是容器类。
U.this.name
,我猜。 - Philippe