Hat selbst: T => und dieses: T => die gleiche Bedeutung hat, wenn ein Merkmal definieren?

StackOverflow https://stackoverflow.com/questions/2219091

  •  19-09-2019
  •  | 
  •  

Frage

Es scheint, ich self oder this für die Bezugnahme auf die Mixed-in-Instanz verwenden kann, oder besser gesagt die Mixed-in-Instanz Zwang. Zum Beispiel sind gleichwertig?

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

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

Ist das nur eine Konvention, oder mit etwas anderes als this einige Vorteile bieten?

War es hilfreich?

Lösung

Mit einem anderen Namen als „this“ kann nützlich sein, wenn Sie Elementtypen haben, die auf die umgebende Instanz verweisen. Zum Beispiel:

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

ist vorzuziehen,

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

Unter bestimmten Umständen.

Andere Tipps

Es kann alles sein: selbst, das, meep, blah, usw. Es ist nur durch den Compiler bei der Bestimmung der Klasse zu werfen verwendet wird (wenn Methoden darauf aufrufen) und tatsächlich zeigen, nicht in der Bytecode auf <. / p>

Achten Sie bei der Benennung, weil lokale Bezeichner die Selbsttypdefinition außer Kraft setzen:

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)
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top