我想在案例类上使用副本。但是scala坚持要我指定在第二个paranthsis中声明的所有属性。
示例:
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的值?
答案 0 :(得分:4)
我不认为这是可能的。在this错误报告中,您可以找到以下声明:
Martin说:案例类别仅在第一个参数列表中被赋予
其余部分不应复制。
答案 1 :(得分:3)
这似乎有效:
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
标记它们,即使简单的f.b访问也会失败。此外,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)
}