从LabelledGeneric实例中提取标签值

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)

  • 十分感谢!小调:尽管从第一个println看起来如此,`keys`类型不是符号或字符串的`HList`,但它也包含标签信息.我需要一个纯字符串的`HList`,所以我不得不在``HList`上沿``对象toName扩展Poly1 {implicit def keyToName [A] = at [Symbol with A](_ .name)}` (4认同)