Scala 在宏展开时获取封闭类实例

Scala 在宏展开时获取封闭类实例,scala,scala-macros,Scala,Scala Macros,我刚开始玩宏,想从 因此,我提出了以下版本: 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.

我刚开始玩宏,想从

因此,我提出了以下版本:

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))")
  }
}

但是它失败了,出现了一个
匹配错误
,据我所知,
封闭类
在调用站点捕获它的封闭类,在REPL会话中它是一个生成的模块。那么如何从
Query
类中提取
value
字段并将其传递给def宏中的
func
表达式呢?

听起来像是在寻找
c.prefix

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))")
  }
}