2010-05-05 6 views
21

Soy nuevo en Scala, y encontré un pequeño inconveniente que me ha estado molestando.Scala Tuple Deconstruction

Inicialización dos variables entre las obras paralelas grandes: var (x,y) = (1,2)

Sin embargo no puedo encontrar una manera de asignar nuevos valores en paralelo: (x,y) = (x+y,y-x) //invalid syntax

termino de escribir algo como esto: val xtmp = x+y; y = x-y; x = xtmp

Me doy cuenta de que escribir código funcional es una forma de evitar esto, pero hay ciertas situaciones donde los vars simplemente tienen más sentido.

Tengo dos preguntas:

1) ¿Hay una mejor manera de hacer esto? ¿Me estoy perdiendo de algo?

2) ¿Cuál es el motivo para no permitir la asignación paralela verdadera?

+5

ver https://lampsvn.epfl.ch/trac/scala/ticket/1324 –

+0

@Seth Tisú, gracias, pero esta es una triste enlace - un WONTFIX :-( – greenoldman

Respuesta

21

Desafortunadamente, no puedes hacer múltiples asignaciones en Scala. Pero usted puede usar tuplas, si se ajustan a su problema:

scala> var xy = (1,2) 
xy: (Int, Int) = (1,2) 

scala> xy = (xy._1 + xy._2, xy._2 - xy._1) 
xy: (Int, Int) = (3,1) 

De esta manera, xy es una tupla con dos valores. Se puede acceder al primer valor usando xy._1, el segundo usando xy._2.

0

Scala tiene 2 tipos de variables: vals y vars. Vals son similares a las variables finales de Java, por lo que yo entiendo de lo que estás pidiendo, la única manera de asignar nuevos valores en paralelo a Vals es por:

scala> val (x, y) = (1, 2); 

o

scala> val s = (3, 4); 
s: (Int, Int) = (3,4) 

scala> s._1 
res1: Int = 3 

scala> s._2 
res2: Int = 4 
+1

entiendo por qué no se puede asignar un nuevo valor a un val. Estoy hablando de la asignación paralela de vars. En el código de mi pregunta, xey son ambos vars. – dbyrne

+5

Él te pregunta si puedes hacer 'val (x, y) = (1,2) 'y' var (x, y) = (1,2) 'entonces ¿por qué no puedes hacer' var x; var y; (x, y) = (1,2) '? –