明确的自我引用没有类型/差异''this''

Phi*_*ppe 34 scala self-type

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

trait T {
  self : T2 =>
  ...
}
Run Code Online (Sandbox Code Playgroud)

在体内,self是别名,this但具有更精确的类型T with T2.

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

trait T {
  self =>
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

Lui*_*hys 43

它是别名this.

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

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

trait U {
  self =>
  val name = "outer"
  val b = new AnyRef {
    val name = "inner"
    println(name)
    println(this.name)
    println(self.name)
  }
}
Run Code Online (Sandbox Code Playgroud)

然后new AnyRef with U打印

inner
inner
outer
Run Code Online (Sandbox Code Playgroud)

"self"不是一个特殊的关键字 - 你可以使用"bananas =>"或任何你喜欢的东西,但它常常被惯例使用.

这在Swing中占了很大的比例,你可以在内部类(滚动窗格中的文本框等)上做很多事情,它们通常有许多方法与外部类具有相同的名称.

  • 好点,谢谢.所以它相当于在这种情况下更长的形式`U.this.name`,我想. (2认同)

Pab*_*dez 9

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

但是,如果碰巧有内部类,则this内部类内部将是内部类,并且self将是容器类.

那是AFAIK的唯一区别