2016-05-12 57 views
0

我有以下的代碼,揭示了問題:Scala錯誤:嘗試修改內容時「重新分配到val」?

case class Best[T](x: Array[T], y: Double) 

def someFunc(byRef : Best[Int]) : Unit = { 
    byRef.y = 5 
} 

,我得到的錯誤:

Multiple markers at this line: 

reassignment to val 
reassignment to val 

這是爲什麼?我不是試圖改變參考,但它的內容...

+0

如果您*真的*需要更新'byRef'的值'y',您可以將'y'聲明爲'var y:Double' – ccheneson

回答

1

這是爲了實現我的使用情況最簡單的方法,並回答我的OP即我需要的是標記的情況下類屬性爲var

case class Best[T](var x: Array[T], var y: Double) 

def someFunc(byRef : Best[Int]) : Unit = { 
    byRef.y = 5 
} 
+1

'case class'可以有'var'。看到一個例子在http://stackoverflow.com/questions/14349165/will-the-var-members-in-case-class-affect-case-classs-equality – ccheneson

+0

謝謝!修復了答案! –

3

case類參數被隱式聲明爲val並被視爲類字段,這就是爲什麼編譯器不允許更改它的值。

而不是改變它的價值,你應該使用copy方法。例如:

byRef.copy(y = 5) 
+0

感謝您的解釋,但我仍然無法解決我的使用案例... –

+0

改用'copy'方法。 –

1

案例分類默認爲immutable。你不能改變它的內容。 相反,你可以創建新的案例類修改的內容:

case class Best[T](x: Array[T], y: Double) 

def someFunc(byRef : Best[Int]) : Best[Int] = { 
    byRef.copy(y = 5) 
} 

爲了達到你所需要的 - 通過簡單的類引入的可變性。 不推薦

class Worst[T](x: Array[T], var y: Double) { 
    override def toString: String = s"$y:${x.toList}" 
    } 

    def someFunc2(byRef : Worst[Int]) : Unit = { 
    byRef.y = 5 
    } 

    val w = new Worst(Array(1), 1) 
    someFunc2(w) 
    println(w) 
+0

有沒有使用返回值的另一種方法?我需要修改它的內容......如何使用非案例類?我也嘗試過,並沒有工作 –

+0

添加替代。 – Rumoku

相關問題