2011-08-22 18 views
12

estoy tratando de hacer algo como lo siguienteEn Scala, ¿cómo puedo reasignar los valores de tupla?

var tuple = (1, "test") 
tuple._2 = "new" 

Sin embargo, esto no se compila se queja de val

+3

estoy mirando http://www.scala-lang.org/api/current/index.html#scala.Tuple3 y todavía no puedo ver la opción de copia – deltanovember

+4

El método de copia se introduce automáticamente porque 'Tuple3' es una' clase de caso'. – Nicolas

Respuesta

38

No se puede reasignar los valores de tupla. Son intencionalmente inmutables: una vez que haya creado una tupla, puede estar seguro de que nunca cambiará. ¡Esto es muy útil para escribir el código correcto!

¿Pero y si quieres una tupla diferente? Ahí es donde el método de copia entra en juego:

val tuple = (1, "test") 
val another = tuple.copy(_2 = "new") 

o si realmente desea utilizar un var para contener la tupla:

var tuple = (1, "test") 
tuple = tuple.copy(_2 = "new") 

Alternativamente, si realmente, realmente quiere que sus valores para cambiar de forma individual, se puede utilizar una clase de casos, no en (probablemente con una conversión implícita para que pueda obtener una tupla cuando lo necesite):

case class Doublet[A,B](var _1: A, var _2: B) {} 
implicit def doublet_to_tuple[A,B](db: Doublet[A,B]) = (db._1, db._2) 
val doublet = Doublet(1, "test") 
doublet._2 = "new" 
+0

Hola Rex, dijiste hace un tiempo que trabajabas en una biblioteca con tipos 'Muple' y otras colecciones mutables. Sería genial verlo en Github! –

+0

@Kipton Barros - Sí, ¿no? Desearía tener tiempo para terminarlo. Me encontré con un montón de errores de especialización y luego me quedé sin tiempo para trabajar a su alrededor. –

0

usted puede envoltorio del componente (s) tiene que modificar en una clase de caso con un miembro de var, como:

case class Ref[A](var value: A) 

var tuple = (Ref(1), "test") 
tuple._1.value = 2 
println(tuple._1.value) // -> 2 
+0

Usar una 'clase de caso 'parece un poco exagerado si lo único que quiere es evitar' nueva Ref (1) '. – jwvh

Cuestiones relacionadas