Scala案例类:复制非相等/ hascode成员

时间:2016-11-18 18:20:59

标签: scala copy case-class

我想在案例类上使用副本。但是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的值?

2 个答案:

答案 0 :(得分:4)

我不认为这是可能的。在this错误报告中,您可以找到以下声明:

  

Martin说:案例类别仅在第一个参数列表中被赋予

     

其余部分不应复制。

稍后,有一个"bug fix"使copy至少返回一个代表第二个参数列表的函数,但该行为已在此commit中恢复。

答案 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)
}