2009-10-26 15 views
25

posso assegnare una tupla come segue:tuple e l'assegnazione stranezza

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

Ma non poi può ri-assegnare come segue

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

Invece mi sembra di avere a che fare:

min = 1 
max = 3 

Perché quest'ultimo funziona mentre il primo no?

risposta

26

Beh, perché era stato previsto in quel modo, suppongo.

Questa, l'assegnazione della tupla, è un esempio di corrispondenza del modello. Pattern matching avviene in tre punti che io ricordi di:

var PATTERN = ... // or val 

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

case PATTERN => ... 

Quindi tutti questi casi di lavoro:

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, prendete l'ultimo esempio, quella che utilizza case. Nota che n e c nell'esempio sono non lo stesso n e c definito un po 'prima. La corrispondenza del modello assegnerà i valori a nuovi identificatori n e c, che oscureranno la precedente definizione per la sequenza dell'istruzione case. La stessa cosa è accaduta nell'esempio for, che non è stato modificato n e c precedentemente definito.

Ora, ciò che si vuole succedere è sovrascrivere il valore precedente, invece di assegnare nuovi valori ai nuovi identificatori. Non è così che funzionano gli abbinamenti di modelli, il che significa che realizzarli implicherebbe una regola completamente nuova. Poiché Scala incita gentilmente le persone verso l'immutabilità, suppongo che non sia irragionevole che non abbiano creato una nuova regola solo per gestirlo.

+1

il ticket è https://issues.scala-lang.org/browse/SI-1324 ("sarà necessario un SIP") –