Wenn ich schreibe:
%Vor%Es zeigt dies.
%Vor%Wie soll ich den obigen Code ändern, damit er Folgendes anzeigt:
%Vor% d. override val t
setzt den Wert von t
für u
im Merkmal T
?
Eine Möglichkeit besteht darin, die Auswertung von u
zu verzögern, indem Sie wie folgt def
oder lazy val
verwenden:
oder
%Vor%Die Unterschiede sind wie folgt:
val
bewirkt, dass ein Ausdruck während der Initialisierung ausgewertet wird def
bewirkt, dass ein Ausdruck jedes Mal ausgewertet wird, wenn u
verwendet wird lazy val
macht es bei der ersten u
Verwendung ausgewertet und speichert das Ergebnis Versuchen Sie es mit einem frühen Initializer:
%Vor%Siehe z.B. hier für weitere Informationen zur frühen Initialisierung.
Der gesamte deklarative Scala-Stil ist nur eine Illusion. Scala baut auf einem jvm auf und funktioniert wie Java.
Evetything ist eine Klasse und sollte unabhängig von ihrer Verwendung sein (Java ist nicht C ++ und unterstützt inkrementelle Builds mit ihren Vor- und Nachteilen). Jedes Merkmal hat seinen eigenen Initialisierungscode und die Multi-Merkmalsklasse führt den jeweiligen Initialisierungscode nacheinander aus. Wenn Sie eine AnyRef verwenden, die nur in einer Unterklasse deklariert ist, wird ihr Wert während der Initialisierung auf Null gesetzt.
Ich bewache mich selbst mit Spezifikationskonvention Regel: jedes val sollte entweder endgültig oder faul sein ( Warum in den nicht endgültigen Klassen einfach val verwenden ). Daher interessiere ich mich nicht für die Reihenfolge der Initialisierung und kann weiter so tun, als ob ich eine deklarative Sprache verwende.
Ich verwende auch die Option -Xcheckinit
: Fügen Sie Laufzeitüberprüfungen zu Feldaccessoren hinzu.