我想創建一個允許我在任何案例類中增加一個名爲「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