如何从Scala宏中使用Predef.implicitly?

时间:2013-11-26 04:15:08

标签: scala macros implicit scala-2.10

有一个带有此签名的方法可在场景后面创建隐式参数:

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不是封闭类。我尝试了不同的事情但没有成功,也没有找到任何样本。

所以问题是:如何使用宏提供方法的隐式参数?

1 个答案:

答案 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一样简单。