使用给定类型的字段迭代键
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))
我定义了一个类型:
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))