Wie initialisiere ich den Wert eines Merkmals im Subtyp?

7

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 ?

    
Mikaël Mayer 02.04.2013, 11:12
quelle

3 Antworten

12

Eine Möglichkeit besteht darin, die Auswertung von u zu verzögern, indem Sie wie folgt def oder lazy val verwenden:

%Vor%

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
Denis R. 02.04.2013, 11:38
quelle
10

Versuchen Sie es mit einem frühen Initializer:

%Vor%

Siehe z.B. hier für weitere Informationen zur frühen Initialisierung.

    
Steve Waldman 02.04.2013 11:44
quelle
4

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.

    
ayvango 02.04.2013 13:13
quelle

Tags und Links