Scala / Shapeless:更新case类实例中的命名字段
发布时间:2020-12-16 18:06:45 所属栏目:安全 来源:网络整理
导读:我试图创建一个类型类,允许我在任何案例类上增加一个名为“counter”的Int字段,只要该类具有这样的字段. 我试图用Shapeless来做这件事,但是在击中墙壁之后(首先尝试消化“宇航员的无形指南”,Shapeless 2.0.0的“功能概述”和Stack Overflow上的众多线程).
我试图创建一个类型类,允许我在任何案例类上增加一个名为“counter”的Int字段,只要该类具有这样的字段.
我试图用Shapeless来做这件事,但是在击中墙壁之后(首先尝试消化“宇航员的无形指南”,Shapeless 2.0.0的“功能概述”和Stack Overflow上的众多线程). 我想要的是能够做类似的事情 case class MyModel(name:String,counter:Int) {} val instance = MyModel("Joe",4) val incremented = instance.increment() assert(incremented == MyModel("Joe",5)) 它适用于任何具有合适计数器字段的案例类. 我认为这可以使用类型类和Shapeless’记录抽象(以及隐式转换来获取作为方法添加的增量功能).裸骨将是这样的: trait Incrementer[T] { def inc(t:T): T } object Incrementer { import shapeless._ ; import syntax.singleton._ ; import record._ implicit def getIncrementer[T](implicit generator: LabelledGeneric[T]): Incrementer[T] = new Incrementer[T] { def inc(t:T) = { val repr = generator.to(t) generator.from(repr.replace('counter,repr.get('counter) + 1)) } } } 但是,这不编译.值replace的错误不是generator.Repr的成员.我想这是因为编译器没有任何保证T有一个名为counter的字段而且它是Int类型.但我怎么能这么说呢?有关Shapeless记录的更好/更多文档吗?或者这是一个完全错误的方式? 解决方法
您必须隐式地需要修改器
import shapeless._ import ops.record._ implicit class Incrementer[T,L <: HList](t: T)( implicit gen: LabelledGeneric.Aux[T,L],modifier: Modifier.Aux[L,Witness.`'counter`.T,Int,L] ) { def increment(): T = gen.from(modifier(gen.to(t),_ + 1)) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |