【问题标题】:Extract label values from a LabelledGeneric instance从 LabelledGeneric 实例中提取标签值
【发布时间】:2014-12-11 23:24:13
【问题描述】:

考虑以下示例:

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

【问题讨论】:

    标签: scala case-class shapeless labelled-generic


    【解决方案1】:

    您可以通过shapeless.ops.record.Keys获取记录的密钥(Symbols)。

    这个

    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)
    

    【讨论】:

    • 太好了,谢谢!一个小提示:尽管从第一个 println 看起来,keys 类型不是符号或字符串的HList,但它也包含标签信息。我需要一个纯字符串的HList,所以我必须用Poly1 沿着object toName extends Poly1 { implicit def keyToName[A] = at[Symbol with A](_.name) } 的行映射HList
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    相关资源
    最近更新 更多