2012-10-05 38 views
0

上更新變換值假設我有一個Scala的情況下類如下所示:Scala中的情況下類(例如倍率設定部)

case class Item(
    roundedValue: Double = 0.00) 

我要上roundedValue執行以下的舍入運算的每個變量是時間更新:

roundedValue = math.round(roundedValue*100)*0.01 

在其他語言中,我只想覆蓋爲roundedValue的二傳手,但現在看來,我不能改寫的情況下,類變量的setter,否則將無法編譯。

一個解決方案,我所看到的是roundedValue重命名爲_roundedValue,並把它變成私有,然後添加公共方法來模擬getter和setter(與舍入邏輯):Overriding setter on var

但是這使得構造函數用法非常尷尬的case類使用命名參數時。有沒有其他的方式來做到這一點,或者這是Scala案例類的限制嗎?

+4

首例所有的類都是默認爲不可變的,因此沒有制定者。 –

+0

好吧,這是有道理的,考慮到當我嘗試實際執行此操作時,我得到了「重新分配到val」的編譯錯誤。 – kgx

+2

默認情況下,roundedValue是一個case類中的val。但是,您可以將case類聲明爲:case class Item(var roundedValue:Double = 0.00),並且該變量將是可變的。 – jcern

回答

1

如果你能使它工作,我會建議保持你的案例類不可改變,但做一個「複製」的方法,你的突變在一個新的實例。

case class Item(roundedValue: Double = 0.0) { 
    def withValue(newValue: Double) = Item(math.round(newValue*100)*0.01) 
} 

您可能也/,而不是希望有同伴對象類似的方法:

object Item { 
    def withValue(value: Double) = Item(math.round(roundedValue*100)*0.01) 
} 
+0

謝謝迪倫。在瞭解了更多關於Scala的信息後,我同意你的評估,即案例類屬性通常應該保持不變(默認值)。由於我的問題的前提是有缺陷的,我接受這個答案的基礎是變異副本是在案例類本身/伴侶對象內完成這個舍入的合理方法。 – kgx

相關問題