2016-05-26 65 views
1

在Scala中是否存在一些對「不可變類的setter」有用的syntaxic糖?scala不可變類vals setters

下面是一個例子:

class Bob (val x:Int, val y:String) 

爲了改變xy,我可以實現這樣說:

object Bob { 
    def updX (b:Bob) (x:Int) = new Bob (x, b.y) 
    def updY (b:Bob) (y:String) = new Bob (b.x, y) 
} 
class Bob (val x:Int, val y:String) { 
    def updX (x:Int) = Bob.updX(this)(x) 
    def updY (y:String) = Bob.updY(this)(y) 
} 

該解決方案是可怕的,因爲我的一些類有8個參數。

有沒有更好的方法來實現這一目標?

+0

你的意思就像案例類的'複製'方法? –

回答

0

作爲@ INSAN-E在his answer提及,所使用的情況下的類的圖案,是一種copy方法相匹配的構造和默認值匹配val的S參數。你可以很容易地實現你自己:

class Bob(val x: Int, val y: String) { 
    def copy(x: Int = x, y: String = y) = new Bob(x, y) 
} 
+0

感謝這也,這個語法是美好的。猜猜我需要去了解更多關於Scala語法功能的信息。 – AntoineKa

5

如果您讓您的班級成爲一個班級,您將獲得免費的複印方法。大小寫類參數是自動不變的,所以不需要把val放在它們前面。

case class Bob(x: Int, y: String) 

val bob1 = Bob(1, "Bob1") 
val bob2 = bob1.copy(y = "Bob2") 
+0

複製案例類似乎是合適的解決方案。謝謝你,我認爲他們只對模式匹配中的解構有用 – AntoineKa

+0

如果你不喜歡case類中的其他東西,你總是可以自己寫'copy'方法。 –