在Scala中,如何重新分配元组值?

时间:2011-08-22 03:17:22

标签: scala

我正在尝试执行以下操作

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

然而,这不会编译它抱怨val

2 个答案:

答案 0 :(得分:39)

您无法重新分配元组值。它们是故意不变的:一旦你创建了一个元组,你就可以确信它永远不会改变。这对于编写正确的代码非常有用!

但是如果你想要一个不同的元组怎么办?这就是复制方法的用武之地:

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

或者如果你真的想使用var来包含元组:

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

或者,如果您确实希望您的值单独更改,则可以使用案例类(可能使用隐式转换,以便在需要时获得元组):

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"

答案 1 :(得分:0)

您可以使用var成员在案例类中包装您需要修改的组件,例如:

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

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