scala's veränderbare und unveränderliche Menge, wenn val und var zu verwenden sind

7

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?

    
mythicalprogrammer 27.06.2011, 05:42
quelle

3 Antworten

16

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.

    
Kipton Barros 27.06.2011, 06:52
quelle
6
Mit

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.

    
Sanjay T. Sharma 27.06.2011 05:46
quelle
0

Sie können += nicht verwenden, wenn Sie val verwenden. Das val/var/def gilt für das Symbol und nicht für dessen Wert / Implementierung probiere val ... du bekommst eine Kompilierung error .

    
Mohit 31.10.2012 01:13
quelle

Tags und Links