请考虑以下示例:
import shapeless._
case class Foo(bar: String, baz: Boolean)
val labl = LabelledGeneric[Foo]
现在,labl
的类型是(美化)
LabelledGeneric[Foo] {
type Repr =
FieldType[Symbol @@ String("bar"), String] ::
FieldType[Symbol @@ String("baz"), Boolean] ::
HNil
}
它已经传达了我需要的信息,即案例类字段的名称。
我正在寻找一种从labl
到类似的东西的方法
"bar" :: "baz" :: HNil
即将单例类型中包含的信息具体化为一个值。
这可能吗?我可以使用宏,但我觉得我最终会重写与 shapeless 中的GenericMacros
对象非常相似的东西,所以我想知道我是否可以直接利用它。
您可以通过 shapeless.ops.record.Keys
获取记录的键(如 Symbol
s)。
这
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))
结果在
'bar :: 'baz :: HNil
List(bar, baz) : List(String)