Scala 如何在运行时枚举无形状记录和访问字段键?
我正在编写处理case类实例列表的通用代码, 收集每个字段中的值,进行组合,然后将其传递给库 使用无形状的Scala 如何在运行时枚举无形状记录和访问字段键?,scala,record,shapeless,Scala,Record,Shapeless,我正在编写处理case类实例列表的通用代码, 收集每个字段中的值,进行组合,然后将其传递给库 使用无形状的LabelledGeneric和多态函数,它看起来如下所示: object toNamedSingletonListOfValues extends Poly1 { implicit def caseField[K,T] = at[FieldType[K, T]](field => { field.key -> List[T](field) }) } val ge
LabelledGeneric
和多态函数,它看起来如下所示:
object toNamedSingletonListOfValues extends Poly1 {
implicit def caseField[K,T] =
at[FieldType[K, T]](field => { field.key -> List[T](field) })
}
val generic = LabelledGeneric[MyClass]
val records = listOfMyClassInstances.map(generic.to)
val values = records.map(_.map(toNamedSingletonListOfValues)) // Then combining and passing
但是,我需要一种获取field.key
的方法,因为库需要参数名
你介意提出解决方案吗?发现肮脏的黑客行为是让Poly看起来像:
import scala.reflect.runtime.universe._
object toNamedSingletonListOfValues extends Poly1 {
implicit def caseField[K: TypeTag, T] = at[FieldType[K, T]] { field =>
(typeOf[K] match { case TypeRef(_, _, args) => args }).last.toString.drop("java.lang.String(\"".size).dropRight(2) -> List[T]()
}
}
有更好的解决方案吗?您可以通过Witness
类型类的实例访问密钥(在编译时已知)作为运行时值:
object toNamedSingletonListOfValues extends Poly1 {
implicit def caseField[K, T](implicit wk: Witness.Aux[K]) =
at[FieldType[K, T]](field => { wk.value -> List[T](field) })
}
不需要运行时反射 谢谢大家!!我现在还有一些东西要重写,但它实际上让我有了进步。顺便说一句,我试着使用Aux'es,但是,我无法从我需要使用的对象中找出Aux。Aux没有文档,而且几乎不可能从不成形的源代码中推断出这方面的知识,因为Aux定义分散在所有不成形的源代码文件中。
Aux
类型都与特定的类型类配对,旨在将类型成员升级为类型参数。您可以使用wk:Witness{typet=K}
编写此代码,但是Aux
版本更好。