Function 如何在scala中的case类中向复制函数添加自定义行为?

Function 如何在scala中的case类中向复制函数添加自定义行为?,function,scala,copy,case-class,Function,Scala,Copy,Case Class,是否可以在case类中添加自定义行为来复制函数 大概是这样的: case class User (version: Integer) { //other fields are omitted //something like this override def copy (...) { return copy(version = version + 1, ...) } } case class User(name:String, age:Int, ver

是否可以在case类中添加自定义行为来复制函数

大概是这样的:

case class User (version: Integer) { //other fields are omitted
    //something like this
    override def copy (...) {
        return copy(version = version + 1, ...)
    }
}
case class User(name:String, age:Int, version:Int = 0) {
  def copy(name:String = this.name, age:Int = this.age) = User(name,age,version+1)
}

所以我不想重写复制函数,只需增加版本字段并复制其他字段。如何才能做到这一点?

将行为添加到基本函数(如复制)中不是一个好主意。函数方法是让数据只是数据,并在函数中具有对来自外部的数据进行操作的行为

但如果您真的想这样做,只需重新实现copy方法,如下所示:

case class User (version: Integer) { //other fields are omitted
    //something like this
    override def copy (...) {
        return copy(version = version + 1, ...)
    }
}
case class User(name:String, age:Int, version:Int = 0) {
  def copy(name:String = this.name, age:Int = this.age) = User(name,age,version+1)
}
用法:

scala> User("John Doe", 25).copy(age = 26)
res4: User = User(John Doe,26,1)    
但是请注意,为了获得有用的行为,您可能还需要重新实现一些其他方法。例如,您可能不希望人们在构造用户时能够传递版本。因此,您需要将构造函数设置为私有,并添加一个apply方法

您也可能不希望考虑版本字段是否相等。因此,您必须重新定义equals和hashCode以省略version字段。因此,既然您已经重新定义了case类提供给您的几乎所有内容,那么您不妨将该类设置为一个普通的非case类


一般来说,我认为case类应该用于纯数据,而更多混合数据和逻辑的面向对象类最好作为普通类来完成,即使这意味着更多的类型。

这些东西更适合我的伴生对象。在这种情况下,我必须复制任何新的case类参数来复制函数。有这样的解决方案:
def copy(参数:)=User(参数,版本+1)
?目前我必须向用户函数显式添加参数。我不知道。如果你只需要这一次,我就接受样板文件。@Cherry u wod hav 2使用宏