如何在groovy中获取以另一个命名的变量的值?

时间:2015-12-15 11:48:07

标签: variables groovy

我有一个变量,其中包含我想要检索值的另一个变量的名称,例如:

def variable = "finalVariableValue"
def variableName = "variable"

我怎样才能获得variable.value,因为我只知道variableName?

我已经看到了一个Binding可以使用但是我有很多变量需要放在这个Binding对象上才能使它工作。是唯一的方法吗?

注意:这种行为与ant属性扩展机制非常相似。

谢谢, 米歇尔。

2 个答案:

答案 0 :(得分:4)

通过在def前面添加前缀,您不会在可以检查的对象中注册它,就像地图一样;有人可能会说它已在AST注册,但这是一条艰难的道路。

我的0.03正在使用地图,绑定或动态属性。删除def部分并选择其中一个解决方案:

地图

只需将variable声明为地图中的关键字:

def map = [:]
map.variable = "finalVariableValue"
def variableName = "variable"

assert map[variableName] == "finalVariableValue"

绑定(带脚本)

使用脚本内置绑定。请注意,这仅适用于脚本:

variable = "finalVariableValue"
variableName = "variable"

assert binding[variableName] == "finalVariableValue"

动态属性

使用一些动态属性机制,例如Expando(您也可以将getPropertysetProperty和其他人一起使用):

class Container extends Expando {
    def declare() {
        variable = "finalVariableValue"
        variableName = "variable"
    }
}

c = new Container()
c.declare()

assert c[c.variableName] == "finalVariableValue"

答案 1 :(得分:0)

您可以使用脚本的范围,只需删除Type定义:

variable = 'value'
name = 'variable'

assert 'variable' == this.name
assert 'value' == this[this.name]

或使用@Field注释:

import groovy.transform.Field

@Field def variable = 'value'
@Field def name = 'variable'

assert 'variable' == this.name
assert 'value' == this[this.name]