我尝试在Groovy中调用动态闭包,现在我被卡住了。我有名字,但我不知道如何使用call()
方法
以下是我想要实现的一个小例子:
def fooClos = { println foo }
def barClos = { println bar}
def c = new Random().nextInt() % 2 == 0 ? "foo" : "bar"
"${c}Clos".call()
因此,最后一行应该打印foo
或bar
我也试过
this."${c}Clos".call()
和
this.&"${c}Clos".call()
没有任何成功。
那么有人可以帮助我如何正确的参考看起来?我可以解决我的问题,但我仍然想知道它是如何完成的。
答案 0 :(得分:5)
如果你没有使用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"()
}
因此fooClos
和barClos
是run
方法中的局部变量。然后它会尝试拨打this.fooClos
或this.barClos
,这显然会失败