2017-07-14 30 views
0

給出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"

爲什麼這裏的行爲不同?

回答

1

TupleOne.copy(_1 = "new")("One", "new", true)。所以當你把它放到一個元組中時,TupleTwo("Two", ("One", "new", true), false)。而TupleTwo._2當然是("One", "new", true)了。 (在打印時,您不會收到引號",因爲這是String上的toString定義的方式。)

+0

正如您指出的那樣,根據示例創建了一個新元組。要從元組中調用所需的元素,應該以嵌套的方式調用元組。(TupleOne._1) var TupleTwo =(「Two」,TupleOne.copy(_1 =「new」),false爲false TupleOne =(「One」,2,true) println(TupleOne._1) var TupleTwo = ) println(TupleTwo._2._2)。現在答案是按需要的。 – NeoWelkin

0

1)根據您的示例,您甚至不需要.copy

你有

var TupleOne=("One", 2, true) 

你期待

var TupleTwo = ("Two","new",false) 

那裏有沒有什麼要複製tupleOne

的另一件事是,你是從,這是Tuple

實例複製第一個元素,但變異第二個元素複製實例.copy收益類型。

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)