按名称查找Groovy闭包



我试图在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()

没有取得任何成功
那么,有人能帮我看一下正确的参考资料吗?我可能可以解决我的问题,但我仍然想知道它是如何解决的。

如果您的闭包不使用def(因此它们进入脚本的绑定),它就会起作用

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,这显然会使失败

最新更新