36

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

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

在正文中,self是一个别名,this但具有更精确的类型T with T2

现在,我在代码中看到了这一点:

trait T {
  self =>
  ...
}

也就是说,没有附加类型信息的显式自引用。在这种配置中,是否存在self不只是别名的情况this

4

2 回答 2

45

它是 的别名this

您的第一个示例有助于确保已将特征混合到适当的类型中,并使这些方法可用。

当您有命名冲突的内部类时,第二个示例很有用,以使外部范围可见。例如:

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 =>”或任何你喜欢的东西,但它通常是按照惯例使用的。

这在 Swing 中出现了很多,您在内部类(滚动窗格中的文本框等)上做了很多工作,它们通常有许多与外部类同名的方法。

于 2011-11-10T01:14:49.513 回答
9

在那种情况下self是另一种说法this

但是,如果您碰巧有一个内部类,则this内部类内部将是内部类,并且self将是容器类。

这是唯一的区别 AFAIK

于 2011-11-09T23:42:01.630 回答