我想创建一个允许我在任何案例类中增加一个名为“counter”的Int字段的类型类,只要该类具有这样的类领域。斯卡拉/无形:在案例类实例中更新命名字段
我试图做到这一点与无形,但我打墙(首先试图消化“无形的类型宇航员的指南”,“无形状2.0.0”和堆栈溢出的许多线程“功能概述”)。
我想要的是能够做到像
case class MyModel(name:String, counter:Int) {}
val instance = MyModel("Joe", 4)
val incremented = instance.increment()
assert(incremented == MyModel("Joe", 5))
它应该对任何情况下的班上做与适合的领域。
我认为这将有可能使用类型类和无形'记录抽象(并隐式转换以获取作为方法添加的增量功能)。裸露的骨头会是这样的:
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))
}
}
}
但是,这不会编译。错误是value replace is not a member of generator.Repr
。我想这是因为编译器不能保证T有一个叫做counter
的字段,它的类型是Int
。但我怎么能这么说呢?没有更好的/有关无形'记录的更多文档?或者这是一个完全错误的路?
这是相当真棒。 –
我很好奇,这是什么'''Witness.''counter'.T'''? –
@CyrilleCorpet这是''计数器''Symbol'唯一的实例类型。这是什么无形的“记录”用于他们的钥匙。 'Witness'可以用来为'Symbol'以外的其他类型的实例创建唯一的类型,比如''Witness.''''一些字符串''.T''。 – Kolmar