使用给定类型的字段迭代键

Iterating Keys with Fields on a given Type

我定义了一个类型:

case class Foo(bar: String)

为此,我想遍历字段(类型和名称)。因此,我为此定义了一个 LabelledGeneric 和一个 Keys 实例。

val labl = LabelledGeneric[Foo]
val keys = Keys[labl.Repr].apply

现在我无法创建没有 Foo 实例的字段。有没有其他方法可以在没有实例 class 的情况下获取字段类型信息?到目前为止,我看到的所有示例都使用了相关类型的实例,但我没有实例,只有类型。理想的是 (Key,Field) collection.

编辑:以前版本的问题是尝试在键上使用 poly1,但我意识到键没有类型信息。

Fields 扩展了 DepFn1,因此在其 apply 方法中需要一个参数。

但是您可以调整其定义以收集您的 Repr 的 ClassTags:

trait FieldTags[L <: HList] extends DepFn0 with Serializable {
  type Out = List[(Symbol, ClassTag[_])]
}

object FieldTags {
  def apply[L <: HList](implicit fields: FieldTags[L]): FieldTags[L] = fields

  implicit def hnilFields[L <: HNil]: FieldTags[L] = 
    new FieldTags[L] { def apply() = List.empty }

  implicit def hconsFields[K <: Symbol, V, T <: HList](implicit
                                                    key: Witness.Aux[K],
                                                    tailFields: FieldTags[T],
                                                    tag: ClassTag[V])
  : FieldTags[FieldType[K, V] :: T] = new FieldTags[FieldType[K, V] :: T] {
    def apply() = (key.value -> tag) :: tailFields.apply()
  }
}

val fields: List[(Symbol, ClassTag[_])] = FieldTags[labl.Repr].apply()
println(fields)
// List(('br, java.lang.String))