明确的自我引用没有类型 / 与“this”有何区别

38

我理解显式类型的自引用的用途:

trait T {
  self : T2 =>
  ...
}

在代码中,selfthis 的别名,但它的类型更精确为 T with T2
现在,我已经在代码中看到这个:
trait T {
  self =>
  ...
}

也就是说,一个没有额外类型信息的显式自引用。在这种配置下,是否存在任何情况使得self不仅仅是this的别名?
2个回答

47

它是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中经常出现,因为你会创建许多内部类(滚动窗格内的文本框等),这些内部类通常具有与外部类相同名称的许多方法。


2
好的,谢谢。所以在这种情况下,它相当于更长的形式 U.this.name,我猜。 - Philippe

10
在这种情况下,self 是指 this 的另一种说法。
但是,如果您有一个内部类,则内部类内的this将是内部类,而self将是容器类。
据我所知,这是唯一的区别。

1
可能还有它的目的。 - kboom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接