簡體   English   中英

Groovy - 檢查 param 是否是一個函數

[英]Groovy - check if param is a function

在 JavaScript 中,這就是我檢查函數參數是否為函數的方式:

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

我如何在 Groovy 中做同樣的事情?

Groovy 使閉包成為一等公民。 每個閉包都擴展了抽象類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)

使您的代碼類型安全始終是一個好習慣,因此您不必擔心作為參數傳遞的值是否是您期望的類型。

在 Groovy 中,您需要檢查p是否是Closureinstanceof

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
def eval = {o->([o].grep(Closure).find()?:{o})()}

println eval('foo')
println eval({->'bar'})
println eval{'baz'}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM