【问题标题】:How can I get the value of a variable named after another one in groovy?如何在 groovy 中获取以另一个变量命名的变量的值?
【发布时间】:2016-03-21 04:45:08
【问题描述】:

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

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

我只知道 variableName,如何获取 variable.value?

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

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

谢谢, 米歇尔。

【问题讨论】:

    标签: variables groovy


    【解决方案1】:

    通过在它前面加上 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"
    

    【讨论】:

    • 谢谢,我在想有一种更“时髦”的方式,但 map 应该可以工作。
    • AFAIK groovy 无法访问变量集合。我猜你想要类似 python 的locals()
    【解决方案2】:

    您可以使用 脚本 的作用域,只需删除 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]
    

    【讨论】:

      猜你喜欢
      • 2012-08-16
      • 2020-04-21
      • 2019-05-23
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      相关资源
      最近更新 更多