通过 shapeless 在 class 情况下递归打印字段名称
recursive print field name in case class via shapeless
我有下一个代码:
trait X
case class Bar(id: Int) extends X
case class Foo(id: Int, bar: Bar) extends X
我想用内部 类 打印 Foo
的所有字段,我为它使用 shapeless,并创建多边形:
object print1 extends Poly1 {
implicit def c[K, V](
implicit wk: Witness.Aux[K]) = {
at[FieldType[K, V]](field => {
wk.value
})
}
}
val foo = Foo(1, Bar(10))
val fooLgen = LabeledGeneric[Foo]
pritnln(fooLgen.to(foo).map(print1)) // => 'id::'bar
但是如何使用内部打印 类?
在您的示例中,您创建了一个 HList
键,然后将其打印出来。您可以按如下方式递归执行此操作:
trait LowerPriorityPrint1 extends Poly1 {
implicit def c[K, V](implicit wk: Witness.Aux[K]) = {
at[FieldType[K, V]](field => {
wk.value
})
}
}
object print1 extends LowerPriorityPrint1 {
implicit def csub[K, V, L <: HList](
implicit l : LabelledGeneric.Aux[V, L],
mapper : Mapper[print1.type, L]
) = {
at[FieldType[K, V]](field => {
l.to(field).map(print1)
})
}
}
val foo = Foo(1, Bar(10))
val fooLgen = LabelledGeneric[Foo]
println(fooLgen.to(foo).map(print1)) // => 'idFoo :: 'idBar :: HNil :: HNil
shapeless 在编译时工作,因此您必须使用隐式在类型级别创建递归。 c
和cSub
对于同一个key同时存在,你可以通过在supertrait
中声明低优先级来决定先解决哪个
我有下一个代码:
trait X
case class Bar(id: Int) extends X
case class Foo(id: Int, bar: Bar) extends X
我想用内部 类 打印 Foo
的所有字段,我为它使用 shapeless,并创建多边形:
object print1 extends Poly1 {
implicit def c[K, V](
implicit wk: Witness.Aux[K]) = {
at[FieldType[K, V]](field => {
wk.value
})
}
}
val foo = Foo(1, Bar(10))
val fooLgen = LabeledGeneric[Foo]
pritnln(fooLgen.to(foo).map(print1)) // => 'id::'bar
但是如何使用内部打印 类?
在您的示例中,您创建了一个 HList
键,然后将其打印出来。您可以按如下方式递归执行此操作:
trait LowerPriorityPrint1 extends Poly1 {
implicit def c[K, V](implicit wk: Witness.Aux[K]) = {
at[FieldType[K, V]](field => {
wk.value
})
}
}
object print1 extends LowerPriorityPrint1 {
implicit def csub[K, V, L <: HList](
implicit l : LabelledGeneric.Aux[V, L],
mapper : Mapper[print1.type, L]
) = {
at[FieldType[K, V]](field => {
l.to(field).map(print1)
})
}
}
val foo = Foo(1, Bar(10))
val fooLgen = LabelledGeneric[Foo]
println(fooLgen.to(foo).map(print1)) // => 'idFoo :: 'idBar :: HNil :: HNil
shapeless 在编译时工作,因此您必须使用隐式在类型级别创建递归。 c
和cSub
对于同一个key同时存在,你可以通过在supertrait