我想定义一个函数,它接受另一个函数(闭包)作为参数。 第二个函数应该接受1个参数。
目前,我只有一个简单的签名:
def func1(func2) {
func2("string")
}
有没有办法明确指出,func2
应该接受1个参数(或更少)?
答案 0 :(得分:7)
不是func1
的定义,而是you can check运行时Closure的maximumNumberOfParameters
,如下所示:
def func1( func2 ) {
if( func2.maximumNumberOfParameters > 1 ) {
throw new IllegalArgumentException( 'Expected a closure that could take 1 parameter or less' )
}
func2( 'string' )
}
测试成功:
def f2 = { a -> "returned $a" }
assert func1( f2 ) == 'returned string'
失败:
def f3 = { a, b -> "returned $a" }
try {
func1( f3 )
assert true == false // Shouldn't get here
}
catch( e ) {
assert e.message == 'Expected a closure that could take 1 parameter or less'
}
答案 1 :(得分:-1)
此代码:
def func1(func2){
if(func2.maximumNumberOfParameters > 1){
throw new IllegalArgumentException('Expected a closure that could take 1 parameter or less')
}
func2('string')
}
def f2= {a-> "returned $a"}
assert func1( f2 ) == 'returned string'
def f3= {a, b-> "returned $a"}
try{
func1(f3)
assert false
}
catch(e){
assert e.message == 'Expected a closure that could take 1 parameter or less'
}
仅在Groovy版本1.1-beta-3及更高版本上运行。
Groovy 1.1-beta-2,1.1-BETA-1,1.0,1.0-RC2和1.0-RC1给出错误消息:
Caught: groovy.lang.MissingPropertyException: No such property: maximumNumberOfParameters for class
Groovy 1.0-JSR-06以及之前提供各种其他错误,具体取决于Groovy版本。