是否可以在scala宏中生成WeakTypeTag中的Apply?
发布时间:2020-12-16 09:49:15 所属栏目:安全 来源:网络整理
导读:我的宏中有一些类型的WeakTypeTag,我想生成如下代码: macroCreate[SomeObject] // = SomeObject(1) 宏的定义将是这样的: def macroCreate[A] = macro _macroCreate[A]def _macroCreate[A](c: Context)(implicit wtt: c.WeakTypeTag[A]) = { c.Expr(Apply(S
我的宏中有一些类型的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? 我可以使用将类型转换为字符串的解决方法,拆分“.”然后创建一个从字符串列表中选择,但这似乎是hacky. 是否可以直接从类型标签创建选择? 解决方法
您可以获取伴随对象的符号,然后使用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),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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |