2009-10-26 10 views
25

asignación puedo asignar una tupla de la siguiente manera:Tupla declaración de parámetros y rareza

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

Pero yo no, entonces puede volver a asignar de la siguiente manera

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

lugar me parece que tiene que hacer:

min = 1 
max = 3 

¿Por qué funciona este último mientras que el primero no?

Respuesta

26

Bueno, porque estaba especificado de esa manera, supongo.

Esto, la asignación de tupla, es un ejemplo de coincidencia de patrones. la coincidencia de patrones que ocurre en tres lugares que recuerdo de:

var PATTERN = ... // or val 

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

case PATTERN => ... 

Así que todos estos casos de trabajo:

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

Ahora, toma el último ejemplo, el uso de case. Tenga en cuenta que n y c en ese ejemplo son no los mismos n y c definidos un poco antes. La coincidencia de patrón asignará valores a nuevos identificadoresn y c, que sombrearán la definición anterior para el escope de la declaración case. Lo mismo sucedió en el ejemplo for, que no cambió n y c previamente definidos.

Ahora, lo que desea es sobrescribir el valor anterior, en lugar de asignar nuevos valores a los nuevos identificadores. No es así como funciona la coincidencia de patrones, lo que significa que hacerlo implicaría una regla completamente nueva. Como Scala empuja suavemente a las personas hacia la inmutabilidad, supongo que no es irracional que no hayan creado una nueva regla solo para manejar esto.

+1

ticket es https://issues.scala-lang.org/browse/SI-1324 ("necesitará un SIP") –