加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

案例案例遗传在Scala

发布时间:2020-12-16 19:02:11 所属栏目:安全 来源:网络整理
导读:我有一个抽象类,我扩展并制作了许多案例类.现在我想复制这些case类的实例,只是改变第一个参数,所以我使用case类’copy方法. 由于我必须为所有从普通抽象类中扩展的案例类执行此操作,而不是为所有这些类执行此操作,所以我尝试使其通用,并将抽象类作为案例类.
我有一个抽象类,我扩展并制作了许多案例类.现在我想复制这些case类的实例,只是改变第一个参数,所以我使用case类’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)

这是我想做的但是,如果我无法使克隆方法工作,那么我将不得不为八达通和青蛙.

任何建议,减少这个冗长度?

解决方法

你不能一般地抽象出案例类的复制方法.我建议使用来自Shapeless或Monocle的镜片:

trait Organism { def legs: Int }
// monocle @Lenses uses a macro to generate lenses
@Lenses case class Octopus(override val legs: Int,...)
  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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读