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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top