有一个带有此签名的方法可在场景后面创建隐式参数:
class A {
def test[T: ClassTag](t: T) = println(t)
}
val a = new A
a.test(123456)
因此应该为方法test
的调用提供隐式参数。当我在REPL中进行reify时,调用树看起来像这样:
Apply(
Apply(
Select(
Select(
newTermName("a"),
newTermName("test")
),
List(
Literal(Constant(123456))) // explicit method args
),
List(
Select(This(newTypeName("Predef")),
newTermName("implicitly"))) // implicit args
)
)
我正在尝试使用宏实现来进行此调用,但这不会编译并给我:Predef不是封闭类。我尝试了不同的事情但没有成功,也没有找到任何样本。
所以问题是:如何使用宏提供方法的隐式参数?
答案 0 :(得分:2)
手动AST操作可能很棘手。请尝试Select(Ident(newTermName("scala")), newTermName("Predef"))
而不是This(newTypeName("Predef"))
。
甚至更好,考虑使用quasiquotes(http://docs.scala-lang.org/overviews/macros/quasiquotes.html)。有了它们,隐式编写引用变得像scala.Predef.implicitly
一样简单。