Ich lese das Programmieren in Scala Buch von der Scala Creator und ich bin etwas verwirrt am Beispiel von Set.
Hier ist es für unveränderliches Set:
%Vor%Was ist der Sinn dieses?
Das Set ist unveränderlich, aber die Variable jetSet ist veränderbar. 1) Also jedes Mal, wenn ich dem Set mit + = hinzufüge, erstellt es ein neues Set? Also zeigt die Variable auf einen neuen Satz im Speicher?
2) Sollte es nicht sein:
val jetSet = set("cow","sheep","duck")
? Warum muss es eine Var sein? Gibt es einen Grund, var für eine unveränderliche Menge zu verwenden?
Der Vorteil von unveränderlichen Datenstrukturen, in diesem Fall Set, ist, dass sie persistent sind. Zum Beispiel:
%Vor% Die Unveränderlichkeit dieser Set-Objekte macht es einfacher, über das Programm nachzudenken, weil Aktualisierungen an der jetSet1
-Variable keine Nebenwirkungen in anderen Teilen des Codes haben (in diesem Fall, wo jetSet2
verwendet wird). Obwohl es aus diesem Beispiel nicht klar ist, gibt es Situationen, in denen es praktisch ist, unveränderliche Werte in änderbaren var
Referenzen zu speichern; Am häufigsten wird der var
einen begrenzten Bereich haben (z. B. lokal für eine Funktion).
Unveränderliche Datenstrukturen haben oft clevere Implementierungen, die ziemlich effizient sind. Leider ist die Scala-Collection-API hinsichtlich der Leistung nicht gut dokumentiert, aber ich würde erwarten, dass die meisten Operationen ungefähr O (log N) -Zeit betragen. Bei einem großen unveränderlichen Set s
sollte man beispielsweise s + x
, ein neues Set mit einem zusätzlichen Element, effizient konstruieren können. Natürlich garantiert Unveränderlichkeit, dass s
ebenfalls erhalten bleibt. Unter der Haube werden s
und s+x
unter Verwendung einer Art von Baumdatenstrukturen mit gemeinsamen Komponenten gespeichert.
Der Titel Ihrer Frage weist darauf hin, dass Sie auch nach einem Hinweis zur Verwendung von val
oder var
suchen. Die Faustregel lautet, val
zu verwenden, wann immer Sie dies bequem tun können. Wenn ein var
erforderlich ist, versuchen Sie, den Umfang der Variablen so weit wie möglich zu begrenzen.
var
können Sie einer Variablen neu zuweisen, sie als normale Variablendeklaration in Java betrachten. Aber im obigen Fall ist es immer ein anderer Satz, auch wenn Sie derselben Variablen neu zuweisen, da Sie eine unveränderliche Variable verwenden.
Der Punkt des Beispiels bestand darin, zu zeigen, dass selbst wenn Sie versuchen, eine unveränderbare Sammlung zu "modifizieren", die Änderungen eine neue Sammlung erstellen, anstatt die ursprüngliche zu berühren. Hätte der Autor ein val
verwendet (in final
in Java), müsste er eine Variable in den Geltungsbereich einfügen, um die neue unveränderliche Menge zu speichern. Ich denke, var
wurde wahrscheinlich verwendet, um das Beispiel einfach zu halten.
Tags und Links scala