来自下面的对象Naming
(改编自Scala macro get enclosing line中的答案),它收集与值相关联的标签,
val x = Naming.apply("")
x: String = x
希望修改apply
方法,以便在Naming
获取指定值标签的情况下提供新的assignedName
实例,即
val x = Naming()
assert( x.assignedName == "x")
在随后的代码中,naîve会像这样改变
def apply(s: String): String = Naming( macro impl )
无法正常工作。任何实例化assignedName
的工作方法都非常有价值。
case class Naming(var assignedName: String = "") {
val m = collection.mutable.Map[String,Int]()
}
object Naming {
import scala.language.experimental.macros
import scala.reflect.macros.Context
def apply(s: String): String = macro impl
def impl(c: Context)(s: c.Expr[String]): c.Expr[String] = {
import c.universe._
c.enclosingClass.collect {
case ValDef(_, name, _, rhs) if rhs.pos == c.macroApplication.pos =>
c.literal(name.decoded)
}.headOption.getOrElse(
c.literal("")
)
}
}
更新在apply
方法中,更新reify
Naming
实例的assisgnedName
可能是一种解决方案。如果可行,怎么能实现呢?