我尝试收集封闭范围内的所有val。
这是宏实现:
import scala.language.experimental.macros
import scala.reflect.macro.blackbox.Context
def impl(c: Context) = {
import c.universe._
c.Expr[Seq[Any]](q"Seq(..${
c.internal.enclosingOwner.owner.typeSignature.decls.collect {
case s if s.isTerm && s.asTerm.isVal => Ident(s)
}
})")
}
def get(c: Context) = macro impl
这是我应用它的方式:
object Foo {
val foo = ""
def poo = get
}
然后它抛出了一个对我没有意义的错误:
error: symbol value foo does not exist in Foo.poo
为什么会这样?你怎么防止它?
答案 0 :(得分:1)
您不希望Ident
方法带有符号,您需要Ident.apply
,这需要Name
。
用Ident(s)
替换Ident(s.name)
(或者可能更清楚q"this.$s"
)将有效。