Gab*_*lla 18 scala case-class shapeless labelled-generic
请考虑以下示例:
import shapeless._
case class Foo(bar: String, baz: Boolean)
val labl = LabelledGeneric[Foo]
Run Code Online (Sandbox Code Playgroud)
现在,类型labl是(美化)
LabelledGeneric[Foo] {
type Repr =
FieldType[Symbol @@ String("bar"), String] ::
FieldType[Symbol @@ String("baz"), Boolean] ::
HNil
}
Run Code Online (Sandbox Code Playgroud)
它已经传达了我需要的信息,即案例类字段的名称.
我正在寻找的是一种从labl某种方式走向某种方式的方式
"bar" :: "baz" :: HNil
Run Code Online (Sandbox Code Playgroud)
即将单例类型中包含的信息具体化为值.
这可能吗?我可以使用一个宏,但我觉得我最终会在无形状中重写与该GenericMacros对象非常相似的东西,所以我想知道我是否可以直接利用它.
Uta*_*aal 20
您可以通过获取记录的键(作为Symbols)shapeless.ops.record.Keys.
这个
import shapeless._
import shapeless.ops.record._
case class Foo(bar: String, baz: Boolean)
val labl = LabelledGeneric[Foo]
val keys = Keys[labl.Repr].apply
println(keys)
println(keys.toList.map(_.name))
Run Code Online (Sandbox Code Playgroud)
结果是
'bar :: 'baz :: HNil
List(bar, baz) : List(String)
Run Code Online (Sandbox Code Playgroud)