2013-11-26 32 views
0

沒有與此簽名創建背後隱含參數的方法:如何從Scala宏中使用Predef.implicitly?

class A { 
    def test[T: ClassTag](t: T) = println(t) 
} 
val a = new A 
a.test(123456) 

所以隱含參數應提供方法test的召喚。當我做了具體化在REPL,呼叫樹是這個樣子:

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不是一個封閉類。我嘗試了不同的事情,但沒有找到任何成功的例子。

所以問題是:如何爲使用宏的方法提供隱式參數?

回答

2

手動AST操作可能會很棘手。試試Select(Ident(newTermName("scala")), newTermName("Predef"))而不是This(newTypeName("Predef"))

甚至更​​好,考慮使用quasiquotes(http://docs.scala-lang.org/overviews/macros/quasiquotes.html)。有了它們,構成一個隱含的引用就變得如同scala.Predef.implicitly一樣簡單。

+0

謝謝,這是行之有效的。我知道quasiquotes,但試圖最小化依賴並更深入地瞭解發生了什麼。所有這些宏觀的東西都很棒。謝謝! –