根据给出的答案here
您无法重新分配元组值。它们是故意不变的:一旦你创建了一个元组,你就可以确信它永远不会改变。这对于编写正确的代码非常有用! 但是,如果你想要一个不同的元组怎么办?这就是复制方法的用武之地:
val tuple = (1, "test")
val another = tuple.copy(_2 = "new")
当我运行以下代码时
var TupleOne=("One", 2, true)
println(TupleOne._1) //Gives One(As desired)
var TupleTwo=("Two", TupleOne.copy(_1 = "new"),false)
println(TupleTwo._2) //Gives (new,2,true)->weird
根据我的理解,第二个元组应为("Two","new",false)
,打印TupleTwo._2
应为"new"
为什么这里的行为有所不同?
答案 0 :(得分:1)
TupleOne.copy(_1 = "new")
是("One", "new", true)
。因此,当您将其添加到元组中时,TupleTwo
为("Two", ("One", "new", true), false)
。 TupleTwo._2
当然是("One", "new", true)
。 (打印时不会得到引号"
,因为toString
上String
的定义是这样的。)
答案 1 :(得分:0)
1)根据您的示例,您甚至不需要.copy
。
你有
var TupleOne=("One", 2, true)
你期待
var TupleTwo = ("Two","new",false)
Theres无需复制tupleOne
。
另一件事是.copy
返回您要复制的实例类型,也是Tuple
复制第一个元素但改变第二个元素的示例。
scala> val tupleOne = ("copyme", "dont-copy-me")
tupleOne: (String, String) = (copyme,dont-copy-me)
scala> val tupleTwo = tupleOne.copy(_2 = "I'm new")
tupleTwo: (String, String) = (copyme,I'm new)
2)让我们举例来说,
scala> val TupleOne=("One",2,true)
TupleOne: (String, Int, Boolean) = (One,2,true)
要获得预期的结果,您必须更改TupleOne
的每个元素,如下所示,这没有任何意义,因为您没有复制任何内容。
scala> TupleOne.copy(_1= "Two", _2 = "new", _3= false)
res3: (String, String, Boolean) = (Two,new,false)
3)同样,由于Tuple.copy
返回Tuple
,TupleTwo
在Tuple
内Tuple
。 (#2是您可能正在寻找的)
scala> var TupleOne=("One",2,true)
TupleOne: (String, Int, Boolean) = (One,2,true)
scala> var TupleTwo=("Two",TupleOne.copy(_1 = "new"),false)
TupleTwo: (String, (String, Int, Boolean), Boolean) = (Two,(new,2,true),false)