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

时间:2011-11-09 23:39:06

标签: scala self-type

我理解explicitly typed self-references的用法:

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

在正文中,selfthis的别名,但具有更精确的T with T2类型。

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

trait T {
  self =>
  ...
}

即,没有其他类型信息的显式自引用。在此配置中,是否存在self不仅仅是this的别名的情况?

2 个答案:

答案 0 :(得分:42)

它是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中出现了相当多的内容,你在内部类(滚动窗格内的文本框等)上做了很多,它们通常有许多方法与外部类具有相同的名称。

答案 1 :(得分:9)

在这种情况下,self是另一种表达this的方式。

但是,如果碰巧有内部类,则内部类中的this将是内部类,而self将是容器类。

这是唯一的区别AFAIK