19

考虑以下示例:

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无形对象非常相似的东西,所以我想知道是否可以直接利用它。

4

1 回答 1

21

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

结果是

'bar :: 'baz :: HNil
List(bar, baz) : List(String)
于 2014-12-12T13:50:58.553 回答