0
我想定義一個無形的LabelledGeneric
,它在轉換爲HList
時忽略一個(或多個)字段;當再次轉換HList
時,它應該替換用戶定義的值。目標是能夠寫這樣的東西:Shapeless LabelledGeneric,但忽略一些字段
case class Foo(i: Int, s: String)
val foo = Foo(123, "Hello")
val gen = LabelledGeneric[Foo].ignoring('i)(defaultValue = -1)
val hlist = gen.to(foo)
// "Hello" :: HNil
val foo2 = gen.from(hlist)
assert(foo2 == Foo(-1, "Hello"))
這是我到目前爲止。它編譯,但我不能讓種正常排隊隱式解析,當我嘗試使用它:
implicit class IgnoringOps[T](orig: LabelledGeneric[T]) {
def ignoring[Orig <: HList, V, Ign <: HList](k: Witness)(defaultValue: V)(implicit
gen: LabelledGeneric.Aux[T, Orig],
rem: Remover.Aux[Orig, FieldType[k.T, V], Ign],
upd: Updater.Aux[Ign, FieldType[k.T, V], Orig]): LabelledGeneric[T] = {
new LabelledGeneric[T] {
override type Repr = Ign
override def to(t: T): Ign = rem(gen.to(t))
override def from(r: Ign): T = gen.from(upd(r, field[k.T](defaultValue)))
}
}
}
任何人都可以擺脫對我做錯了任何光線?
啊哈!我錯過了隱藏的'Align',這是我忘記的(我傾向於將'record'視爲無序的Maps,當然,當重構case class實例時,排序很重要)。謝謝 :) –