2013-11-26 4 views
0

Существует метод с этой подписью, что создает неявный параметр за сценой:Как использовать Predef.implicitly из макросов Scala?

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

Так неявный параметр должен быть предусмотрен для вызова метода test. Когда я делаю материализовать в РЕПЛ, дерево вызовов выглядит следующим образом:

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

Ручная манипуляция АСТ может быть сложной задачей. Попробуйте Select(Ident(newTermName("scala")), newTermName("Predef")) вместо This(newTypeName("Predef")).

Или еще лучше, рассмотрите возможность использования квазиквадратов (http://docs.scala-lang.org/overviews/macros/quasiquotes.html). С ними составление ссылки неявно становится таким же простым, как scala.Predef.implicitly.

+0

Спасибо, это работает. Я знаю о квазикварталах, но стараюсь свести к минимуму зависимости и глубже понять, что происходит. Все это макрос отлично. Благодаря! –

Смежные вопросы