2011-08-22 13 views
12

che sto cercando di fare qualcosa di simile al seguenteIn Scala, come posso riassegnare i valori della tupla?

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

Tuttavia questo non compilarlo lamenta val

+3

sto guardando http://www.scala-lang.org/api/current/index.html#scala.Tuple3 e ancora non riesco a vedere l'opzione di copia – deltanovember

+4

Il metodo copy viene introdotto automaticamente perché 'Tuple3' è una' case class'. – Nicolas

risposta

38

Non è possibile riassegnare valori tupla. Sono intenzionalmente immutabili: una volta creata una tupla, puoi essere sicuro che non cambierà mai. Questo è molto utile per scrivere il codice corretto!

Ma cosa succede se si desidera una tupla diversa? Ecco dove il metodo di copia è disponibile in:

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

o se davvero si vuole utilizzare un var per contenere il tupla:

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

In alternativa, se davvero, vuole veramente i valori per cambiare individualmente, è possibile utilizzare una classe caso invece (probabilmente con una conversione implicita in modo da poter ottenere una tupla quando ne avete bisogno):

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

Ciao Rex, hai menzionato qualche istante prima stavi lavorando su una libreria con tipi 'Muple' e altre raccolte mutabili. Sarebbe bello vederlo su Github! –

+0

@Kipton Barros - Sì, non è così? Vorrei avere il tempo di finirlo. Mi sono imbattuto in un sacco di bug di specializzazione e poi ho finito il tempo per aggirarli. –

0

è possibile wrapper componente (s) è necessario modificare in una classe case con un var membro, come:

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

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

L'uso di una 'case class' sembra un po 'eccessivo, se tutto ciò che vuoi è evitare' new Ref (1) '. – jwvh

Problemi correlati