我刚开始玩宏,想要从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
表达式?
答案 0 :(得分:2)
听起来像是在寻找c.prefix
。