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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top