Подтвердить что ты не робот

Do self: T => и это: T => имеют то же значение при определении признака?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

в некоторых случаях.

Ответ 2

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

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

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)
}