2016-11-15 9 views
2

私はその後、内容を更新するには、この新しいvar yに機能updateを使用し、私は機能cloneを使用してクローニングし、別のvar yに設定していたタイプListBuffer[ListBuffer[Int]]var xを持っていますが、私がチェックしたときにvar xの元の内容はvar yと同じですか?どうしてこれなの?私は間違って何をしていますか?彼らは回避策ですか?私は最初のListBufferの元の内容を変更せずに変更できるListBufferのコピーを取得しようとしています。クローニングListBuffer不変の問題スカラ

答えて

4

cloneだけ浅いコピーを作成し、あなたは深いコピーが必要になります。

scala> import collection.mutable.ListBuffer 
import collection.mutable.ListBuffer 

scala> var a = ListBuffer(ListBuffer(1, 2), ListBuffer(3,4)) 
a: scala.collection.mutable.ListBuffer[scala.collection.mutable.ListBuffer[Int]] = ListBuffer(ListBuffer(1, 2), ListBuffer(3, 4)) 


scala> var b = a.clone 
b: scala.collection.mutable.ListBuffer[scala.collection.mutable.ListBuffer[Int]] = ListBuffer(ListBuffer(1, 2), ListBuffer(3, 4)) 

scala> b(0)(0) = 100 

scala> a 
res1: scala.collection.mutable.ListBuffer[scala.collection.mutable.ListBuffer[Int]] = ListBuffer(ListBuffer(100, 2), ListBuffer(3, 4)) 

scala> b 
res2: scala.collection.mutable.ListBuffer[scala.collection.mutable.ListBuffer[Int]] = ListBuffer(ListBuffer(100, 2), ListBuffer(3, 4)) 

scala> var c = a.clone.map(_.clone) 
c: scala.collection.mutable.ListBuffer[scala.collection.mutable.ListBuffer[Int]] = ListBuffer(ListBuffer(100, 2), ListBuffer(3, 4)) 

scala> c(0)(0) = 1000 

scala> c 
res3: scala.collection.mutable.ListBuffer[scala.collection.mutable.ListBuffer[Int]] = ListBuffer(ListBuffer(1000, 2), ListBuffer(3, 4)) 

scala> a 
res4: scala.collection.mutable.ListBuffer[scala.collection.mutable.ListBuffer[Int]] = ListBuffer(ListBuffer(100, 2), ListBuffer(3, 4)) 
+0

は深いコピーを達成するために、VARのC = a.clone.mapは理想的な方法に(。_クローン) ''のですか? –

+0

このような単純なことについては、私は「はい」と言っています。もっと複雑で深いものは、(これは(https://github.com/kostaskougios/cloning)のような)もっと魅力的な解決策が必要かもしれません。 –

関連する問題