2011-04-21 14 views

Respuesta

6

Aquí se ve una versión limitada de la coincidencia de patrones al inicializar variables. Tenga en cuenta que esto funciona no sólo para tuplas:

val a :: b = List(1,2,3) 
println(a) //1 
println(b) //List(2, 3) 

Esta característica parece ser prestado directamente de Haskell, donde se puede utilizar patrones para la inicialización, así:

let (a,b) = getTuple 
in a*b 

Como Haskell no tiene datos mutables, no hay forma de asignar algo.

En Scala usted podría hacer algo como esto, pero supongo que esto se consideró demasiado confuso, o tal vez demasiado difícil de implementar. Siempre puede usar una expresión match como de costumbre, y a menudo solo necesita un case, p. Ej. List((1,2),(3,4)).map{ case (a,b) => a*b }.

2

Mi sospecha sería que sin la "var" o "val" a la izquierda de la tupla de nombres de variables, el compilador trata la tupla como una tupla. Es decir, realmente intenta asignar un valor a una instancia de Tuple3 y no a las tres variables, y eso no tiene sentido para el compilador.

Por cierto, el uso de una función y varios tipos de datos en su ejemplo no es relevante. Aquí hay un ejemplo más simple:

scala> var (i, j, k) = (1, 2, 3) 
i: Int = 1 
j: Int = 2 
k: Int = 3 

scala> (i, j, k) = (4, 5, 6) 
<console>:1: error: ';' expected but '=' found. 
     (i, j, k) = (4, 5, 6) 
       ^
Cuestiones relacionadas