代码之家  ›  专栏  ›  技术社区  ›  darksoulsong

Groovy-检查param是否为函数

  •  5
  • darksoulsong  · 技术社区  · 7 年前

    在JavaScript中,我是这样检查函数参数是否为函数的:

    function foo ( p ) {
        if ( typeof p === 'function' ) {
            p();
        }
        // ....
    }
    

    如何在Groovy中实现同样的功能?

    3 回复  |  直到 7 年前
        1
  •  10
  •   Szymon Stepniak    7 年前

    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)
    

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

        2
  •  5
  •   tim_yates    7 年前

    在Groovy中,您需要检查 p 是一个 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
    
        3
  •  0
  •   plajko    5 年前
    def eval = {o->([o].grep(Closure).find()?:{o})()}
    
    println eval('foo')
    println eval({->'bar'})
    println eval{'baz'}