Domanda

Posso assegnare una tupla come segue:

var (min, max) = (1, 2)

Ma non posso quindi riassegnare come segue

(min, max) = (1, 3) //compiler error: ';' expected but '=' found

Invece mi sembra di dover fare:

min = 1
max = 3

Perché il secondo funziona mentre il primo no?

È stato utile?

Soluzione

Beh, perché è stato specificato in questo modo, suppongo.

Questo, l'assegnazione della tupla, è un esempio di corrispondenza del modello. La corrispondenza dei modelli avviene in tre punti di cui mi ricordo:

var PATTERN = ... // or val

for (PATTERN <- ...) ...

case PATTERN => ...

Quindi tutti questi casi funzionano:

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)
}

Ora, prendi l'ultimo esempio, quello che usa case . Nota che n e c in quell'esempio sono non gli stessi n e c definito un po 'prima. La corrispondenza del modello assegnerà i valori agli nuovi identificatori n e c , che ombreggeranno la definizione precedente per l'escape del caso . La stessa cosa è successa nell'esempio for , che non ha modificato n e c precedentemente definiti.

Ora, ciò che vuoi che accada è sovrascrivere il valore precedente, invece di assegnare nuovi valori a nuovi identificatori. Non è così che funziona il pattern matching, il che significa che realizzarlo comporterebbe una regola completamente nuova. Dato che Scala spinge delicatamente le persone verso l'immutabilità, suppongo che non sia irragionevole che non abbiano creato una nuova regola solo per gestirla.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top