按照这里给出的答案
无法重新分配元组值。它们是有意不可变的:一旦你创建了一个元组,你就可以确信它永远不会改变。这对于编写正确的代码非常有用! 但是,如果您想要一个不同的元组怎么办?这就是复制方法的用武之地:
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"
为什么这里的行为不同?
TupleOne.copy(_1 = "new")
("One", "new", true)
.所以当你把它放进一个元组时,TupleTwo
("Two", ("One", "new", true), false)
.当然,TupleTwo._2
又("One", "new", true)
了。(在打印引号时,您不会"
引号,因为这就是String
上的toString
的定义。
1)根据你的示例,你甚至不需要.copy
。
你有
var TupleOne=("One", 2, true)
你期待
var TupleTwo = ("Two","new",false)
没有什么可以复制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)