【发布时间】:2022-01-27 18:08:37
【问题描述】:
考虑到在创建时计算了默认字段的案例类,是否可以将其复制到新复制的案例类重新计算该字段的位置?
例如TestCopy.auto在创建时生成:
case class TestCopy(static: String, auto: Long = System.currentTimeMillis()) {
val auto2 = System.currentTimeMillis()
}
如果我复制它只更改字段static:
val a = TestCopy(static = "a")
val b = a.copy(static = "b")
字段auto 不会重新计算。构造函数字段auto2也不是:
> println(a)
> println(b)
> println(a.auto2)
> println(b.auto2)
TestCopy(a,1640773176392)
TestCopy(b,1640773176392)
1640773176392
1640773176392
实际上,这是有道理的,因为我正在复制案例类。 但是,我想要一个类似于重新创建案例类的行为,我只更改一组静态字段。 上面的示例已简化,我可以再次创建它。该问题针对以下情况:
case class TestCopy2(static1: String,
static2: String,
static3: String,
auto: Long = System.currentTimeMillis())
其中只有static1必须更改,static2和static3必须复制,auto必须重新生成。
有可能吗?
谢谢大家。
【问题讨论】:
-
您认为
val是什么意思?是否有任何其他替代关键字可以赋予它不同的行为?那么,当case class中的字段被假定为不可变值但您希望它不断变化时,将其作为一个字段是否有意义? -
对于这种用法,您必须每次手动实例化一个新的实例,
copy无济于事。不过,您可以创建一个自定义的apply方法。 -
@GaëlJ 我不太确定这个问题想要做什么,但自定义
apply最有意义。 -
@yangzai,当然我们可以使用 var 作为可变变量。但问题是关于将案例类复制到新的类。
-
@YFI 我不是在说
var
标签: scala functional-programming copy case-class