2014-10-13 4 views
0

Пусть а классПолучить имя назначенной переменной во время выполнения в Scala

case class C(val i: Int) { 
    var assignee: Option[String] = None 
} 

и для данного присвоения переменной с именем x,

val x = C(1) 
x: C = C(1) 

как получить значение "x": String к x.assignee, а именно

assert(x.assignee == Some("x")) 
+0

и если этот объект находится в массиве или какой-то коллекции? –

+0

@DenisTulskiy хорошая точка, только на 'val', иначе' assignee' остается 'None'. – elm

+0

Не знаю, что вы просите. – tuxdna

ответ

1

Локальные имена переменных недоступны во время выполнения. Но вы можете записать его с a macro во время компиляции. См. definingValName в https://github.com/sbt/sbt/blob/9c442d3aed53bdc89db1ada9d5b204bf02adb339/main/settings/src/main/scala/sbt/std/KeyMacro.scala и его использований:

def definingValName(c: Context, invalidEnclosingTree: String => String): String = { 
    import c.universe.{ Apply => ApplyTree, _ } 
    val methodName = c.macroApplication.symbol.name 
    def processName(n: Name): String = n.decoded.trim // trim is not strictly correct, but macros don't expose the API necessary 
    def enclosingVal(trees: List[c.Tree]): String = { 
    trees match { 
     case vd @ ValDef(_, name, _, _) :: ts => processName(name) 
     case (_: ApplyTree | _: Select | _: TypeApply) :: xs => enclosingVal(xs) 
     // lazy val x: X = <methodName> has this form for some reason (only when the explicit type is present, though) 
     case Block(_, _) :: DefDef(mods, name, _, _, _, _) :: xs if mods.hasFlag(Flag.LAZY) => processName(name) 
     case _ => 
     c.error(c.enclosingPosition, invalidEnclosingTree(methodName.decoded)) 
     "<error>" 
    } 
    } 
    enclosingVal(enclosingTrees(c).toList) 
} 

def enclosingTrees(c: Context): Seq[c.Tree] = 
    c.asInstanceOf[reflect.macros.runtime.Context].callsiteTyper.context.enclosingContextChain.map(_.tree.asInstanceOf[c.Tree]) 
+0

Большое спасибо, как скомпилировать его (не могли попасть на REPL без ошибок) и как его запустить. – elm

Смежные вопросы