scala 宏 - 如何将 Array[TermName] 扩展到 HList 串联
scala macro - how to expand an Array[TermName] to HList concatenation
假设我有一个案例class
case class(id: Option[Long], name: String, gender: String)
然后我通过编译时反射得到了字段名
val names = ... // Array(TermName(id), TermName(name), TermName("gender"))
如何将这些名称转换为 id :: name :: gender :: HNil
(类型为 Option[Long] :: String :: String :: HNil]
)
也就是说我正在寻找类似 q"..$name"
的东西,但用 ::
而不是 ,
扩展名称
好像可以这样
def hlistConcat[T: Liftable ](elems: Iterable[T]) = {
val HNil = q"HNil": Tree
elems.toList.reverse.foldLeft(HNil) { (list, c) =>
q"$c :: $list"
}
}
假设我有一个案例class
case class(id: Option[Long], name: String, gender: String)
然后我通过编译时反射得到了字段名
val names = ... // Array(TermName(id), TermName(name), TermName("gender"))
如何将这些名称转换为 id :: name :: gender :: HNil
(类型为 Option[Long] :: String :: String :: HNil]
)
也就是说我正在寻找类似 q"..$name"
的东西,但用 ::
而不是 ,
好像可以这样
def hlistConcat[T: Liftable ](elems: Iterable[T]) = {
val HNil = q"HNil": Tree
elems.toList.reverse.foldLeft(HNil) { (list, c) =>
q"$c :: $list"
}
}