在宏扩展时获取封闭的类实例

时间:2014-01-31 07:01:16

标签: scala scala-macros

我刚开始玩宏,想要从this

实现一个宏
class Queryable[T] {
 def map[U](p: T => U): Queryable[U] = macro QImpl.map[T, U]
}
object QImpl {
 def map[T: c.WeakTypeTag, U: c.WeakTypeTag]
        (c: Context)
        (p: c.Expr[T => U]): c.Expr[Queryable[U]] = ...
}

所以我想出了以下版本:

class Query[T](val value: T) {
  def map[U](func: T => U): Query[U] = macro Qry.map[T, U]
}

object Qry {
  def map[T: c.WeakTypeTag, U: c.WeakTypeTag](c: Context)(func: c.Expr[T => U]): c.Expr[Query[U]] = {
    import c.universe._
    val q"class Query($value) { ..$body }" = c.enclosingClass
    c.Expr[Query[U]](q"new Query($func($value))")
  }
}

但它以MatchError失效,因为我理解enclosingClass在呼叫站点捕获它的封闭类,在REPL会话中是生成的模块。那么如何从value类中提取Query字段并将其传递给def宏中的func表达式?

1 个答案:

答案 0 :(得分:2)

听起来像是在寻找c.prefix