gpt4 book ai didi

scala - Scala 中的个案继承

转载 作者:行者123 更新时间:2023-12-03 22:29:54 29 4
gpt4 key购买 nike

我有一个抽象类,我扩展并制作了许多案例类。现在我想复制那些只是改变第一个参数的案例类的实例,所以我使用案例类'copy方法。

由于我必须对从通用抽象类扩展而来的所有案例类都这样做,而不是对所有案例类都这样做,因此我尝试使其通用并将抽象类设为案例类。

然后 Scala 给了我这个:

case class Octopus has case ancestor Organism, but case-to-case inheritance is prohibited. To overcome this limitation, use extractors to pattern match on non-leaf nodes.



代码:
abstract class Organism(legs: Int)
case class Octopus(override val legs: Int, weight: Double, ...)
case class Frog(override val legs: Int, ...)
def clone(o: Organism) = o.copy(legs = -1)

这就是我想要做的。但如果我做不到 clone方法有效,那么我将不得不为 Octopus 进行复制& Frog .

任何建议,以减少这种冗长?

最佳答案

你不能抽象案例类'copy方法一般。我建议使用 Shapeless 或 Monocle 的镜头:

trait Organism { def legs: Int }
// monocle @Lenses uses a macro to generate lenses
@Lenses case class Octopus(override val legs: Int, weight: Double, ...)
extends Organism
@Lenses case class Frog(val legs: Int, ...) extends Organism

def clone[O <: Organism](o: O, legsLens: Lens[O, Int]): O =
legsLens.set(-1)(o)

val myOctopus = Octopus(8, 2.4, ...)
val myFrog = Frog(2, ...)

// use the generated Lenses
val cloneOctopus: Octopus = clone(myOctopus, Octopus.legs)
clone(myFrog, Frog.legs)

关于scala - Scala 中的个案继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28745327/

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