respuesta de Daniel resume muy bien la forma correcta de hacer esto, así como por qué funciona. Como él ya cubrió ese ángulo, intentaré responder a su pregunta más amplia (con respecto al diseño del idioma) ...
Siempre que sea posible, Scala se esfuerza por evitar agregar funciones de idioma a los mecanismos existentes. Por ejemplo, Scala no incluye una declaración break
. Sin embargo, es casi trivial para rodar una de su propio como una biblioteca:
case object BreakException extends RuntimeException
def break = throw BreakException
def breakable(body: =>Unit) = try {
body
} catch {
case BreakException =>()
}
Esto se puede utilizar de la siguiente manera:
breakable {
while (true) {
if (atTheEnd) {
break
}
// do something normally
}
}
(nota: esto está incluido en la biblioteca estándar para Scala 2.8)
Las sintaxis de asignaciones múltiples, como las permitidas por los idiomas como Ruby (por ejemplo, x = 1, y = 2, z = 3
) entran en la categoría de "sintaxis redundante". Cuando Scala ya tiene una característica que habilita un patrón particular, evita agregar una nueva característica solo para manejar un caso especial de ese patrón. En este caso, Scala ya tiene una coincidencia de patrones (una característica general) que se puede usar para manejar asignaciones múltiples (mediante el truco de tupla descrito en otras respuestas). No es necesario que maneje ese caso especial en particular de forma separada.
En un lado ligeramente diferente, cabe señalar que la sintaxis de asignación múltiple de C (y, por lo tanto, Java) también es un caso especial de otra característica más general. Considerar:
int x = y = z = 1;
Este explota el hecho de que la asignación devuelve el valor asignado en lenguajes C-derivado (así como el hecho de que la asignación es asociativo por la derecha). Este no es el caso en Scala. En Scala, la asignación devuelve Unit
. Si bien esto tiene algunos inconvenientes molestos, es más teóricamente válido ya que enfatiza la naturaleza de la asignación colateral de la asignación directamente en su tipo.
Vale la pena señalar que 'val (a, b, c) = (1, 2, 3)' no parece ser el idioma generalmente aceptada para la asignación múltiple, preferible separar instrucciones de asignación. Al menos, esa ha sido mi impresión al leer el código desarrollado por la comunidad. –
También vale la pena señalar que puede establecer valores múltiples en el mismo valor con el "val x, y, z = 42" intuitivo. –
También hay 'val seq @ Seq (a, b, c) = Seq (1,2,3)' que no solo define los valores 'a',' b' y 'c', sino también el seqeunce' seq '! – Mullefa