2016-11-15 11 views
2

불변의 문제는, 나는 그 내용을 업데이트하려면이 새로운 var y에 기능 update를 사용하지만, var x의 원본 내용은 var y과 동일합니까? 왜 이런거야? 내가 도대체 ​​뭘 잘못하고있는 겁니까? 그들의 해결 방법은 있습니까? 초기 ListBuffer의 원래 내용을 변경하지 않고 수정할 수있는 ListBuffer 복사본을 얻으려고합니다.복제 ListBuffer I 유형 <code>ListBuffer[ListBuffer[Int]]</code>의 <code>var x</code>이있는 나는 기능 <code>clone</code>를 사용하여 복제하고 다른 <code>var y</code> 설정을 가지고 스칼라

답변

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)와 같은 멋진 솔루션을 원할 수도 있습니다. –