Groovy - 检查param是否是一个函数

dar*_*ong 5 parameters groovy function typechecking

在JavaScript中,这是我检查函数参数是否是函数的方式:

function foo ( p ) {
    if ( typeof p === 'function' ) {
        p();
    }
    // ....
}
Run Code Online (Sandbox Code Playgroud)

我怎么能在Groovy中做同样的事情?

Szy*_*iak 8

Groovy使封闭成为一流的公民.每个闭包都扩展了抽象类groovy.lang.Closure<V>,如果是未定义的参数类型,您可以使用它instanceof来检查传递给方法的参数是否为闭包.像这样的东西:

def closure = {
    println "Hello!"
}

def foo(p) {
    if (p instanceof Closure) {
        p()
    }
}

foo(closure)
Run Code Online (Sandbox Code Playgroud)

运行此脚本会生成输出:

Hello!
Run Code Online (Sandbox Code Playgroud)

使用具体参数类型

Groovy允许您(实际上值得做)定义一个方法参数的类型.p您可以要求调用者传递闭包,而不是检查是否为闭包.考虑以下示例:

def closure = {
    println "Hello!"
}

def foo2(Closure cl) {
    cl()
}

foo2(closure)
foo2("I'm not a closure")
Run Code Online (Sandbox Code Playgroud)

第一次调用将执行闭包操作(打印"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)
Run Code Online (Sandbox Code Playgroud)

使代码类型安全始终是一个好习惯,因此您不必担心作为参数传递的值是否是您期望的类型.


tim*_*tes 5

在Groovy中,你想要检查是否pinstanceofaClosure

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')
Run Code Online (Sandbox Code Playgroud)

输出:

I'm a closure
p is tim and not a Closure
Run Code Online (Sandbox Code Playgroud)