为什么自我而不是自我参考?

时间:2016-10-09 20:11:33

标签: scala traits self-reference

我理解自我类型的结果是什么,如

trait SpellChecker {
  self: RandomAccessSeq[char] =>
  ...
}

来自http://www.markthomas.info/blog/92

但我不明白为什么在这里使用self代替this更好......!另外,如果我写asfd而不是self我也没有收到编译错误...所以我不太确定" self"就是这样。我不知道以后可以在特征的某个方法中像对象一样使用self

2 个答案:

答案 0 :(得分:3)

self是您的SpellChecker实例的别名。如果您有嵌套结构(如类),这将非常有用。考虑一下:

trait Foo {
  self =>

  override def toString : String = "Foo here"

  class Bar {
    def print() : Unit = {
      println(s"this = $this")
      println(s"self = $self")
    }
    override def toString : String = "Bar here"
  }
}

val foo = new Foo {}
val bar = new foo.Bar()
bar.print()

输出:

this = Bar here 
self = Foo here

因此,如果要引用外部元素,可以使用别名。使用this表示没有别名,因此this : Example =>表示“我不需要别名,我只想确保将其与示例”混合使用。您可以为自己的别名命名,但asfdiLikeFries一样好。 self只是一种惯例。

答案 1 :(得分:1)

在这种特殊情况下,重命名this是没有意义的。在嵌套的情况下,当您重命名外部this并在嵌套的模板/对象中访问它时,它更有意义。