Declaración de parámetros de tupla y rareza de asignación
Pregunta
Puedo asignar una tupla de la siguiente manera:
var (min, max) = (1, 2)
Pero no puedo reasignar de la siguiente manera
(min, max) = (1, 3) //compiler error: ';' expected but '=' found
En cambio, parece que tengo que hacer:
min = 1
max = 3
¿Por qué funciona esto último mientras que el primero no?
Solución
Bueno, porque se especificó de esa manera, supongo.
Esta, la asignación de tupla, es un ejemplo de coincidencia de patrones. La coincidencia de patrones ocurre en tres lugares que recuerdo:
var PATTERN = ... // or val
for (PATTERN <- ...) ...
case PATTERN => ...
Entonces todos estos casos funcionan:
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, tome el último ejemplo, el que usa case
. Tenga en cuenta que n
y c
en ese ejemplo son no los mismos n
y c
definido un poco antes. La coincidencia de patrón asignará valores a los identificadores nuevos n
y c
, lo que sombreará la definición anterior para el alcance del caso
declaración. Lo mismo sucedió en el for
ejemplo, que no cambió n
y c
definidos previamente.
Ahora, lo que quiere que suceda es sobrescribir el valor anterior, en lugar de asignar nuevos valores a nuevos identificadores. No es así como funciona la coincidencia de patrones, lo que significa que suceder implicaría una regla completamente nueva. Dado que Scala empuja suavemente a las personas hacia la inmutabilidad, supongo que no es irrazonable que no hayan creado una nueva regla solo para manejar esto.