在JavaScript中,这是我检查函数参数是否为函数的方法:
function foo ( p ) {
if ( typeof p === 'function' ) {
p();
}
// ....
}
如何在Groovy中执行相同操作?
答案 0 :(得分:6)
Groovy让closures成为一流的公民。每个闭包都扩展了抽象类groovy.lang.Closure<V>
,如果是未定义的参数类型,您可以使用instanceof
来检查传递给方法的参数是否为闭包。这样的事情:
def closure = {
println "Hello!"
}
def foo(p) {
if (p instanceof Closure) {
p()
}
}
foo(closure)
运行此脚本会生成输出:
Hello!
Groovy允许您(实际上值得做)定义一种方法参数。您可以要求调用者传递闭包,而不是检查p
是否为闭包。请考虑以下示例:
def closure = {
println "Hello!"
}
def foo2(Closure cl) {
cl()
}
foo2(closure)
foo2("I'm not a closure")
第一次调用将执行闭包操作(打印“Hello!”),但第二次调用将抛出异常:
Hello!
Caught: groovy.lang.MissingMethodException: No signature of method: test.foo2() is applicable for argument types: (java.lang.String) values: [I'm not a closure]
Possible solutions: foo2(groovy.lang.Closure), foo(java.lang.Object), find(), find(groovy.lang.Closure), wait(), run()
groovy.lang.MissingMethodException: No signature of method: test.foo2() is applicable for argument types: (java.lang.String) values: [I'm not a closure]
Possible solutions: foo2(groovy.lang.Closure), foo(java.lang.Object), find(), find(groovy.lang.Closure), wait(), run()
at test.run(test.groovy:18)
使代码类型安全始终是一个好习惯,因此您不必担心作为参数传递的值是否是您期望的类型。
答案 1 :(得分:5)
在Groovy中,您需要检查instanceof
是Closure
还是def foo(p) {
if (p instanceof Closure) {
p()
} else {
println "p is $p and not a Closure"
}
}
foo { -> println "I'm a closure" }
foo('tim')
I'm a closure
p is tim and not a Closure
输出:
"editorGroupHeader.tabsBackground"
答案 2 :(得分:0)
def eval = {o->([o].grep(Closure).find()?:{o})()}
println eval('foo')
println eval({->'bar'})
println eval{'baz'}