按名称查找Groovy闭包

按名称查找Groovy闭包,groovy,Groovy,我试图在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

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

没有任何成功。

那么,有人能帮助我正确的引用应该是什么样子吗?我可能可以解决我的问题,但我仍然想知道它是如何完成的。

如果不使用
def
进行闭包()

如果您使用
@Field
注释对它们进行标记,以便将它们添加为生成的脚本类的字段,则该方法也会起作用:

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

如果不使用
def
进行闭包()

如果您使用
@Field
注释对它们进行标记,以便将它们添加为生成的脚本类的字段,则该方法也会起作用:

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

哇,回答得太好了!我最后把闭包放在了一张地图上,在那里我可以用我想要的任何名字得到它们。但现在我明白了为什么它以前不起作用了。哇,回答得真好!我最后把闭包放在了一张地图上,在那里我可以用我想要的任何名字得到它们。但现在我明白了为什么它以前不起作用了。