如何定义接受参数化闭包作为参数的Groovy函数?

时间:2012-07-25 16:14:12

标签: groovy

我想定义一个函数,它接受另一个函数(闭包)作为参数。 第二个函数应该接受1个参数。

目前,我只有一个简单的签名:

def func1(func2) {
   func2("string")
}

有没有办法明确指出,func2应该接受1个参数(或更少)?

2 个答案:

答案 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版本。