【发布时间】:2012-09-16 19:29:04
【问题描述】:
我想定义一个带有一个参数的闭包(我用 it 引用)
有时我想将另一个附加参数传递给闭包。
我怎样才能做到这一点?
【问题讨论】:
标签: groovy parameters arguments closures optional
我想定义一个带有一个参数的闭包(我用 it 引用)
有时我想将另一个附加参数传递给闭包。
我怎样才能做到这一点?
【问题讨论】:
标签: groovy parameters arguments closures optional
您可以将第二个参数设置为默认值(例如 null):
def cl = { a, b=null ->
if( b != null ) {
print "Passed $b then "
}
println "Called with $a"
}
cl( 'Tim' ) // prints 'Called with Tim'
cl( 'Tim', 'Yates' ) // prints 'Passed Yates then Called with Tim
另一种选择是使b 成为一个可变参数列表,如下所示:
def cl = { a, ...b ->
if( b ) {
print "Passed $b then "
}
println "Called with $a"
}
cl( 'Tim' ) // prints 'Called with Tim'
cl( 'Tim', 'Yates' ) // prints 'Passed [Yates] then Called with Tim
cl( 'Tim', 'Yates', 'Groovy' ) // prints 'Passed [Yates, Groovy] then Called with Tim
【讨论】:
@TypeChecked 编译 :-( - 使用 @TypeChecked(value=TypeCheckingMode.SKIP) 它再次工作......与可变参数版本相同
希望这会有所帮助
def clr = {...a ->
print "Passed $a then "
enter code here
}
clr('Sagar')
clr('Sagar','Rahul')
【讨论】:
@tim_yates 的变体不适用于 @TypeChecked(在类上下文中),至少对于忽略默认参数的 Groovy 2.4.11 和无法编译 :-(
因此,在这种情况下可行的其他(诚然丑陋的)解决方案是:
首先声明闭包似乎工作正常(无论如何都是递归所必需的):
def cl
cl = { ... }
使用 @TypeChecked(value=TypeCheckingMode.SKIP) 对两者都适用,但随后您将放松对方法(或类,取决于您放置它的位置)的类型检查
声明闭包委托cl2:
@TypeChecked
class Foo {
static main( String[] args ) {
def cl = { a, b ->
if( b != null )
print "Passed $b then "
println "Called with $a"
}
def cl2 = { a -> cl( a, null ) }
cl2( 'Tim' ) // prints 'Called with Tim'
cl( 'Tim', 'Yates' ) // prints 'Passed Yates then Called with Tim
}
}
将闭包转化为类方法,例如
@TypeChecked
class Foo {
cl( a, b=null ) {
if( b != null )
print "Passed $b then "
println "Called with $a"
}
static main( String[] args ) {
cl( 'Tim' ) // prints 'Called with Tim'
cl( 'Tim', 'Yates' ) // prints 'Passed Yates then Called with Tim
}
}
【讨论】: