复制方法(Scala Tuple)无法正常工作

时间:2017-07-14 05:31:45

标签: scala tuples

根据给出的答案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"

为什么这里的行为有所不同?

2 个答案:

答案 0 :(得分:1)

TupleOne.copy(_1 = "new")("One", "new", true)。因此,当您将其添加到元组中时,TupleTwo("Two", ("One", "new", true), false)TupleTwo._2当然是("One", "new", true)。 (打印时不会得到引号",因为toStringString的定义是这样的。)

答案 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返回TupleTupleTwoTupleTuple(#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)