我的宏中有某种类型的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
?
答案 0 :(得分:8)
您可以获取伴随对象的符号,然后使用Universe的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
。