复制方法(Scala 元组)无法按预期工作



按照这里给出的答案

无法重新分配元组值。它们是有意不可变的:一旦你创建了一个元组,你就可以确信它永远不会改变。这对于编写正确的代码非常有用! 但是,如果您想要一个不同的元组怎么办?这就是复制方法的用武之地:

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,您的TupleTwoTupleTuple内。(#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)

最新更新