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
def
wird bei jeder Verwendung neu ausgewertet, wird bei lazy val
der ersten Verwendung val
ausgewertet, wird bei seiner Initialisierung ausgewertet. So:
val v
wird bei seiner Initialisierung ausgewertet und gibt v aus .- als nächstes
var s
wird initialisiert und zugewiesend
, was auswertetdef d
und somit d druckt . - dann
lazy val l
wird zugewiesens
– dies wird zum ersten Mall
verwendet, also wird dies der Zeitpunkt, an dem es ausgewertet wird und l ausgibt . - die Zuweisung
v
zus
druckt nichts, weil der Wert (3) während der Initialisierung vonv
(-> Schritt 1) gespeichert wurde. - Die Neuzuweisung
l
zus
druckt nichts, da der Wert (5) während der Initialisierung von gespeichert wurdel
(was bei der ersten Verwendung in Schritt 3 geschah). - Neuzuweisung
d
ans
prints d , weild
es a istdef
und daher bei jedem Aufruf neu ausgewertet wird.
(Anmerkung: Da Sie verwenden +=
, wäre es präziser zu schreiben, „ s + x
ist zugewiesen zu s
“, wo ich gerade geschrieben habe, „ x
ist zugewiesen zu s
“, aber für die vorliegende Frage (warum Dinge gedruckt werden) spielt es keine Rolle, ob Sie dies tun v += x
oder v = x
.)
Beantwortet von – MartinHH
Antwort geprüft von – Cary Denson (FixError Admin)