Tuple Parameter Deklaration und Zuordnung oddity
Frage
Ich kann ein Tupel zuordnen wie folgt:
var (min, max) = (1, 2)
Aber ich kann nicht dann re-assign wie folgt
(min, max) = (1, 3) //compiler error: ';' expected but '=' found
Stattdessen scheinen ich zu tun:
min = 1
max = 3
Warum diese Arbeit während der ehemaligen nicht?
Lösung
Nun, weil es auf diese Weise spec'ed wurde, nehme ich an.
Dies ist die Tupel Zuordnung, ist ein Beispiel für Mustererkennung. Musterabgleich geschieht in drei Orte, die ich erinnere mich an:
var PATTERN = ... // or val
for (PATTERN <- ...) ...
case PATTERN => ...
So all diese Fälle arbeiten:
val l = List((1,'a'), (2,'b'), (3,'c'))
var (n, c) = l(0)
for ((n, c) <- l) println(n+": "+c)
l(1) match {
case (n, c) => println(n+": "+c)
}
Nun, nehmen Sie das letzte Beispiel, das man mit case
. Beachten Sie, dass n
und c
in diesem Beispiel sind nicht die gleiche n
und c
etwas früher definiert. Die Mustererkennung werden Werte zuweisen neuen Identifikatoren n
und c
, die die vorherige Definition für den eScope der case
Aussage Schatten werden. Das gleiche geschah auf dem for
Beispiel, das nicht definiert n
und c
vorher änderte.
Nun, was Sie wollen geschehen ist, den vorherigen Wert zu überschreiben, statt zuweisen neue Werte zu neuen Bezeichner. Das ist nicht, wie Muster funktioniert übereinstimmt, was bedeutet, so dass es eine völlig neue Regel passieren würde zur Folge haben. Da Scala sanft Leute in Richtung Unveränderlichkeit stupst, nehme ich es nicht unvernünftig haben sie nicht eine neue Regel erstellen, diese zu behandeln.