Имеют ли self: T => и this: T => одинаковые значения при определении черты? - PullRequest
11 голосов
/ 08 февраля 2010

Кажется, я могу использовать self или this для ссылки на смешанный экземпляр или, скорее, для ограничения смешанного экземпляра. Например, это эквивалентно?

scala> trait A { self: List[_] => }
defined trait A

scala> trait B { this: List[_] => }
defined trait B

Это просто соглашение, или использование чего-то отличного от this дает некоторые преимущества?

Ответы [ 2 ]

18 голосов
/ 08 февраля 2010

Использование имени, отличного от «this», может быть полезно, когда у вас есть типы членов, которые ссылаются на включающий экземпляр. Например,

trait Outer { self =>
  trait Inner {
    def outer = self
  }
}

предпочтительнее,

trait Outer {
  trait Inner {
    def outer = Outer.this
  }
}

при некоторых обстоятельствах.

6 голосов
/ 08 февраля 2010

Это может быть что угодно: self, this, meep, blah и т. Д. Он используется только компилятором при определении, к какому классу приводиться (при вызове методов для него), и фактически не отображается в байт-коде.

Будьте осторожны при именовании, потому что локальные идентификаторы переопределяют определение собственного типа:

trait A {
  def baz = println("baz!")
}
trait B {
  foo: A => 
  val foo = "hello"   
  // def bar = foo.baz // does not compile because foo is String, not A
  def bar = foo.substring(1)
}
...