gpt4 book ai didi

scala - 如何复制实例并覆盖特征中声明的值字段

转载 作者:行者123 更新时间:2023-12-05 05:28:08 25 4
gpt4 key购买 nike

假设我在特征中定义了一些抽象值字段:

trait Base {
val toBeOverride: String
}

case class Impl(other:Int) extends Base {
override val toBeOverride = "some value"
}

我如何编写一个函数,我可以轻松地获得一个克隆的实例,只覆盖 toBeOverride 值,如下所示:

// copy only available to case class instance
// v does not have method 'copy'
def overrideBaseValue[T <: Base](v: Base) =
v.copy(toBeOverride = "prefix" + v.toBeOverride)

?

编辑

@som-snytt,我不认为这是重复的,就像 TraitAbstract Class 不同一样。这个问题的答案并不令我满意,见下文。

@Blaisorblade,是的,这是个问题。对于每个子案例类的实例,toBeOverride 字段是相同的,因此它不应出现在构造函数中。

目前所有的建议都是在每个(!)子案例类中定义一个自定义的 copy 方法,在我看来这很丑陋并且显示了语言的无能。

最佳答案

最简单的解决方案是只添加你想要的方法到 Base:

trait Base {
val toBeOverride: String
def copyBase(newToBeOverridden: String): Base
}

case class Impl(other:Int, override val toBeOverride: String = "some value") extends Base {
def copyBase(newToBeOverridden: String) = copy(toBeOverride = newToBeOverridden)
}

这还允许直接创建 Impl 的实例,同时指定 toBeOverride 的值(这是不可能的)。唯一的缺点是现在使用 Impl 的模式匹配必须更改语法 - 请更新您的问题并在出现问题时添加评论。

顺便说一句,如果您只想添加一个前缀(如您的示例所示),那没问题:

case class Impl(other:Int, override val toBeOverride: String = "some value") extends Base {
def copyBase(newToBeOverridden: String) = copy(toBeOverride = toBeOverride + newToBeOverridden)
}

关于scala - 如何复制实例并覆盖特征中声明的值字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13789245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com