Scala 从LabelledGeneric实例中提取标签值

Scala 从LabelledGeneric实例中提取标签值,scala,case-class,shapeless,labelled-generic,Scala,Case Class,Shapeless,Labelled Generic,考虑以下示例: import shapeless._ case class Foo(bar: String, baz: Boolean) val labl = LabelledGeneric[Foo] 现在,labl的类型为(美化) 它已经传递了我需要的信息,即案例类字段的名称 我要寻找的是一种从labl到 "bar" :: "baz" :: HNil i、 e.将单例类型中包含的信息具体化为一个值 这可能吗? 我可以使用宏,但我觉得我最终会在shapeless中重写一些非常类似于Gene

考虑以下示例:

import shapeless._

case class Foo(bar: String, baz: Boolean)
val labl = LabelledGeneric[Foo]
现在,
labl
的类型为(美化)

它已经传递了我需要的信息,即案例类字段的名称

我要寻找的是一种从
labl

"bar" :: "baz" :: HNil
i、 e.将单例类型中包含的信息具体化为一个值

这可能吗?
我可以使用宏,但我觉得我最终会在shapeless中重写一些非常类似于
GenericMacros
对象的东西,因此我想知道是否可以直接利用它。

您可以通过
shapeless.ops.record.keys
获得记录的键(如
Symbol
s)

这个

导致

'bar :: 'baz :: HNil
List(bar, baz) : List(String)

太好了,谢谢!一个小提示:尽管它看起来像第一个println,
keys
类型不是符号或字符串的
HList
,但它也包含标记信息。我需要纯字符串的
HList
,因此我必须用
Poly1
沿着
object toName extensed Poly1{implicit def keyToName[a]=at[Symbol with a](u.name)}
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)