Из объекта Naming
ниже (адаптировано из ответа в макрос Scala получает закрывающую строку), который собирает метку, связанную со значением,
val x = Naming.apply("")
x: String = x
хотел бы изменить метод apply
, чтобы он доставлял новый экземпляр Naming
, где assignedName
принимает назначенную метку значения, а именно:
val x = Naming()
assert( x.assignedName == "x")
В следующем коде такое наивное изменение
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
. Если это возможно, как это можно реализовать?