[FIXED] Instanziierungsreihenfolge zwischen Val, def, lazy val in Scala

Ausgabe

Kann mir jemand erklären, wie das vdld pleeease ausfallen kann?

def deflazyval() : Unit = {
  lazy val l : Int ={print("l") ; 5}
  def      d : Int ={print("d") ; 7}
  val      v : Int ={print("v") ; 3}
  
  var s : Int = d
  s += l
  s += v
  s += l
  s += d

}

Lösung

defwird bei jeder Verwendung neu ausgewertet, wird bei lazy valder ersten Verwendung valausgewertet, wird bei seiner Initialisierung ausgewertet. So:

  1. val vwird bei seiner Initialisierung ausgewertet und gibt v aus .
  2. als nächstes var swird initialisiert und zugewiesen d, was auswertet def dund somit d druckt .
  3. dann lazy val lwird zugewiesen s– dies wird zum ersten Mal lverwendet, also wird dies der Zeitpunkt, an dem es ausgewertet wird und l ausgibt .
  4. die Zuweisung vzu sdruckt nichts, weil der Wert (3) während der Initialisierung von v(-> Schritt 1) ​​gespeichert wurde.
  5. Die Neuzuweisung lzu sdruckt nichts, da der Wert (5) während der Initialisierung von gespeichert wurde l(was bei der ersten Verwendung in Schritt 3 geschah).
  6. Neuzuweisung dan s prints d , weil des a ist defund daher bei jedem Aufruf neu ausgewertet wird.

(Anmerkung: Da Sie verwenden +=, wäre es präziser zu schreiben, „ s + xist zugewiesen zu s“, wo ich gerade geschrieben habe, „ xist zugewiesen zu s“, aber für die vorliegende Frage (warum Dinge gedruckt werden) spielt es keine Rolle, ob Sie dies tun v += xoder v = x.)


Beantwortet von –
MartinHH


Antwort geprüft von –
Cary Denson (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like