从LabelledGeneric实例中提取标签值

时间:2014-12-11 23:24:14

标签: scala case-class shapeless labelled-generic

考虑以下示例:

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

即。将单例类型中包含的信息具体化为值。

这可能吗? 我可以使用一个宏,但我觉得我最终会在无形状中重写与GenericMacros对象非常相似的东西,所以我想知道我是否可以直接利用它。

1 个答案:

答案 0 :(得分:20)

您可以通过Symbol获取记录的密钥(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))

结果

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