我有一个WeakTypeTag
我的宏中的某种类型,我想生成如下代码:
macroCreate[SomeObject] // => SomeObject(1)
宏的定义将是这样的:
def macroCreate[A] = macro _macroCreate[A]
def _macroCreate[A](c: Context)(implicit wtt: c.WeakTypeTag[A]) = {
c.Expr(Apply(Select(???, newTermName("apply")), List(c.literal(1).tree)))
}
问题是我怎样才能得到Select
对于给定类型?
我可以使用一种解决方法,将类型转换为字符串,然后拆分"."
然后创建一个Select
来自字符串列表,但这看起来很古怪。
是否有可能创建一个Select
直接从类型标签?
你可以得到伴生物体的符号,然后使用宇宙的Ident(sym: Symbol): Ident
工厂方法:
def macroCreate[A] = macro _macroCreate[A]
def _macroCreate[A](c: Context)(implicit wtt: c.WeakTypeTag[A]) = {
import c.universe._
c.Expr(
Apply(
Select(Ident(wtt.tpe.typeSymbol.companionSymbol), newTermName("apply")),
c.literal(1).tree :: Nil
)
)
}
进而:
scala> case class SomeObject(i: Int)
defined class SomeObject
scala> macroCreate[SomeObject]
res0: SomeObject = SomeObject(1)
scala> macroCreate[List[Int]]
res1: List[Int] = List(1)
如果你真的是这个意思SomeObject
是对象的类型(即,不是其伴生类的类型),只需删除.companionSymbol
above.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)