function - 如何在 Scala 中的案例类中添加自定义行为以复制函数?

标签 function scala copy case-class

是否可以在案例类中添加自定义行为以复制函数?

像这样:

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)    

但请注意,为了获得有用的行为,您可能还必须重新实现一些其他方法。例如,您可能不希望人们在构建用户时能够传递版本。所以你需要将构造函数设为私有(private)并添加一个 apply 方法。

您也可能不希望将版本字段视为相等。所以你必须重新定义 equals 和 hashCode 来省略版本字段。因此,既然您已经重新定义了案例类提供给您的几乎所有内容,那么您不妨将该类设为普通的非案例类。

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

关于function - 如何在 Scala 中的案例类中添加自定义行为以复制函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25601281/

相关文章:

php - 邮件功能的主题问题 - PHP

c - C 中字符串数组和函数的问题

performance - Haskell 模式匹配有多快?

arrays - 在 scala 中,如何在 zip 两个数组后进行过滤

java - Spark : Cogroup RDDs fails in case of huge group

ios - 将图像复制到iOS中的粘贴板

java - 基本深拷贝,Java

javascript - Javascript 错误 : Unexpected token (

postgresql - 无法将列的 266 :class java. math.BigDecimal 转换为 Long

postgresql - Postgres COPY 命令 - 带逗号的字段,用双引号引起来