【问题标题】:Find Groovy Closure by name按名称查找 Groovy Closure
【发布时间】:2013-11-26 15:31:14
【问题描述】:

我尝试在 Groovy 中调用动态闭包,但现在卡住了。我有名字,但是不知道怎么用call()方法引用它

这是我想要实现的一个小例子:

def fooClos = { println foo }
def barClos = { println bar}
def c = new Random().nextInt() % 2 == 0 ? "foo" : "bar"
"${c}Clos".call()

所以最后一行应该打印foobar

我也试过

this."${c}Clos".call()

this.&"${c}Clos".call()

没有成功。
那么有人可以帮我看看正确的参考是怎样的吗?我可能可以解决我的问题,但我仍然想知道它是如何完成的。

【问题讨论】:

    标签: groovy


    【解决方案1】:

    如果您不使用 def 进行闭包,它会起作用 (so they go into the binding of the script)

    fooClos = { println 'foo' }
    barClos = { println 'bar' }
    def c = new Random().nextInt() % 2 == 0 ? "foo" : "bar"
    "${c}Clos"()
    

    如果您使用 @Field 注释标记它们也可以工作,以便将它们添加为生成的 Script 类的字段:

    import groovy.transform.*
    
    @Field def fooClos = { println 'foo' }
    @Field def barClos = { println 'bar' }
    def c = new Random().nextInt() % 2 == 0 ? "foo" : "bar"
    "${c}Clos"()
    

    多一点解释

    您将其有效编译为的原始方式:

    public java.lang.Object run() {
        java.lang.Object fooClos = { 
            return this.println('foo')
        }
        java.lang.Object barClos = { 
            return this.println('bar')
        }
        c = new java.util.Random().nextInt() % 2 == 0 ? 'foo' : 'bar'
        return this."$cClos"()
    }
    

    所以fooClosbarClosrun 方法中的局部变量。然后它尝试调用this.fooClosthis.barClos,这显然失败了

    【讨论】:

    • 哇,好答案!我最终将闭包放在了一张地图中,我可以用任何我想要的名字来获取它们。但现在我明白为什么它以前不起作用了。
    猜你喜欢
    • 2016-12-28
    • 1970-01-01
    • 2015-04-12
    • 2015-04-29
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 2021-05-17
    • 2018-04-15
    相关资源
    最近更新 更多