2016-09-29 49 views
0

我有這樣的事情:在功能轉型上輸入參數的副作用

object MyObject { 
    var element1 /**/ 
    var element2 /**/ 
    var myOtherObject: OtherObject = new OtherObject 
} 

object MyOtherObject { 
    var something1 /**/ 
    var something2 /**/ 
    var myList: List[T] = List() 
} 

def myUpdateFunction(iMyObject: MyObject) : SomeObject = { 
    var myCopiedObject = iMyObject 

    myCopiedObject.myList.dropRight 
    /*checkpoint*/ 

    val myAwesomeOtherObject = new MyOtherObject 
    /*perform multiple tasks to update myAwesomeOtherObject members*/ 

    myAwesomeOtherObject 
} 

當我檢查的「關卡」註釋行,我看到我的myCopiedObject.myList已經成功地進行了改造,但myUpdateFunction執行我的iMyObject也有,即。 iMyObject.myList被一個截斷。

我不明白這是怎麼發生的。

任何線索,任何人?

順便說一句,我使用spark

+1

iMyObject創建副本是爲myObject的實例的引用。你賦值給myCopiedObject純粹只是基於引用。您需要製作一個iMyObject的新副本。 –

+0

在Scala中使用'var'被認爲是一種不好的習慣,所以如果可以的話,應該避免它。 –

回答

2

這是因爲你只是分配相同的對象到另一個引用。 myCopiedObject不是您的對象的副本。您應該編寫一個方法,該方法將使用與iMyObject保持相同的值創建MyObject的新實例。

2
var myCopiedObject = iMyObject 

上述代碼不會創建對象的副本。你基本上是指相同的對象,但使用不同的參考。

使用case class和使用copy方法與要求的變化

case class Something(list: List[Int]) 

val sthing = Something(List(1, 2)) 
val copy = sthing.copy(list = sthing.list.take(1)) //creating changed copy using copy method