2016-11-18 48 views
2

我想在案例類中使用副本。但斯卡拉堅持我指定了第二個paranthsis中聲明的所有屬性。斯卡拉案例分類:複製不等於/ hascode成員

例子:

package academic.classes.casec.copy 

object TstClz { 
    val f = DataMe("SD") ("B") 
    val x = f.copy("x 4")()//Error : not enough arguments for method copy: (b: String, c: String)academic.classes.casec.copy.DataMe. Unspecified value parameters b, c. 
} 

case class DataMe (a : String, a1 : String = "a1")(b:String, c: String = ""){} 

這是一個功能或一個錯誤?我能做些什麼,使其工作就是我想要的(從它的副本正在作出的實例得到b和c的值

+1

任何使用curried case類構造函數的理由? – Max

+0

我認爲'copy'沒有「繼承」構造函數的默認參數(來自後面的參數列表),因此您必須給它所有的參數,或者在構造函數的一個參數列表中進行設置。 – laughedelic

回答

2

這似乎工作:?

object TstClz { 
    val f = DataMe("SD") ("B") 
    val x = f.copy("x 4")(b = f.b, c = f.c) 
} 

case class DataMe (a : String, a1 : String = "a1")(val b:String, val c: String = "") {} 

只添加b = f.b, c = f.c不足夠的,似乎來自秒列表的參數默認沒有定義case class的值,並且沒有用val標記它們,即使簡單的fb訪問也會失敗。而且,copy似乎被定義爲用兩個參數返回一個函數,但沒有默認值

注意:我有測試用2.11.8和2.12.0來編輯它。我認爲the commit fxlae在他的回答中引用並沒有完全恢復的行爲,如承諾有這樣的源代碼註釋:

僅複製的第一個參數列表中的默認值,如SI-5009。

(提交在2.12.0中標記爲存在)。

,正如你在評論中寫道,您可以添加您自己的副本執行,如果首選,讓所有val■找它們的默認值:

def copy(a: String = a, a1: String = a1, b: String = b, c: String = c): DataMe = { 
    DataMe(a, a1)(b, c) 
} 
+0

至少這是一些解決方法。也許會讓我自己的fn拿這個實例並像這樣自我複製 – tgkprog

4

我不認爲這是可能的。在this bug報告,你可以找到下面的語句:

馬丁說:案例類內斯只授予的第一個參數列表

其餘不應該被複制的。

後來,有一個"bug fix"這使得copy至少返回表示第二個參數列表的功能,但行爲在這個commit恢復。

+0

謝謝你的發現。我期待這是一個功能。希望有一種方法可以標記我們希望將其他行爲作爲另一個功能。 – tgkprog