2010-07-27 14 views
9

puedo hacer algo comoScala asignación múltiple a variable existente

def f(): Tuple2[String, Long] = ... 
val (a, b) = f() 

¿Qué pasa si las variables ya existen? Estoy ejecutando los mismos conjuntos de datos sobre los filtros y no quiero encadenarlos (nombres largos y demás). Esto es lo que intenté, pero se queja de esperar; en lugar de = en la última línea:

var a = ...initialization for this data 
var b = ...some other init 
(a, b) = g(a, b) // error: expected ';' but found '=' 

¿Hay alguna manera de evitar una tupla intermediaria?

+0

no tengo una fuente útil, pero recuerdo haber leído en alguna parte que la asignación múltiple var esa manera es una mala idea y no se admite en Scala. Esto fue hace unos meses (y quién sabe cuándo se escribió el original), pero tengo entendido que necesita un intermediario. – Mike

+0

posible duplicado de [Scala Tuple deconstrucción] (http://stackoverflow.com/questions/2776651/scala-tuple-deconstruction) –

Respuesta

8

Respuesta corta: No.

1

Funciona para nuevos valores, ya que la sintaxis es tratada como una coincidencia de patrones, al igual que las declaraciones de casos. Entonces, como dijo Alex, no puedes hacerlo.

14

Como señaló Alex, la respuesta corta es no. Lo que está sucediendo con su código es este: cuando a y b ya son variables en el alcance actual, (a, b) significa "tomar los valores de ayb y construir una tupla de ellos".

Por lo tanto,

(a, b) = ... 

es equivalente a

(new Tuple2(a, b)) = ... 

que obviamente no es lo que quiere (además de ser sin sentido).

La sintaxis que desea (posibilidad de asignar a múltiples variables a la vez) simplemente no existe. Ni siquiera puede asignar el mismo valor a varias variables preexistentes a la vez (la sintaxis habitual "a = b = ..." que se encuentra en muchos otros idiomas no funciona en Scala). No creo que sea un accidente que vals recibe tratamiento preferencial sobre vars; casi siempre son una mejor idea.

Parece que todo esto tiene lugar dentro de un bucle de algún tipo, y haciendo asignaciones repetidas. Esto no es muy idiomático Scala. Le recomendaría que trate de eliminar el uso de vars en su programa y haga las cosas de una manera más funcional, usando los gustos de map, flatMap, filter, foldLeft, etc.

+0

La sintaxis Scala para la asignación de variables múltiples es 'var a, b, c = 0' Utiliza comas, no múltiples signos iguales. –

+2

Lee lo que dije de nuevo. Estaba hablando de asignar a múltiples * variables * preexistentes * en una declaración, sin declarar nuevas variables con valores iniciales.El primero es lo que el OP está buscando y lo que no es compatible con Scala (que yo sepa). –

0

Si ejecuta siempre "los mismos conjuntos" de datos "sobre filtros, etc., es un síntoma de que pertenecen de alguna manera juntos, por lo que debe considerar agruparlos utilizando una tupla o una clase dedicada (generalmente una clase de caso en tales casos).

0

La solución que he encontrado es la siguiente:

// declare as var, not val 
var x = (1,"hello") 
// x: (Int, String) = (1,hello) 

// to access first element 
x._1 
// res0: Int = 1 

// second element 
x._2 
// res1: String = hello 

// now I can re-assign x to something else 
x = (2, "world") 
// x: (Int, String) = (2,world) 

// I can only re-assign into x as long the types match 
// the following will fail 

x = (3.14, "Hmm Pie") 
<console>:8: error: type mismatch; 
found : Double(3.14) 
required: Int 
     x = (3.14, "Hmm Pie") 
Cuestiones relacionadas