我想定义一个闭包,它接受一个参数(我用 引用it
)有时我想将另一个附加参数传递给闭包。我怎样才能做到这一点?
问问题
12746 次
3 回答
42
您可以将第二个参数设置为默认值(例如 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
于 2012-09-25T09:54:30.853 回答
3
希望这会有所帮助
def clr = {...a ->
print "Passed $a then "
enter code here
}
clr('Sagar')
clr('Sagar','Rahul')
于 2016-05-19T06:58:06.197 回答
0
@tim_yates的变体不适用于@TypeChecked
(在类上下文中),至少Groovy 2.4.11
在默认 arg 被忽略且无法编译的情况下:-(
因此,在这种情况下可行的其他(诚然丑陋的)解决方案是:
首先声明关闭似乎工作正常(无论如何都是递归所必需的):
def cl cl = { ... }
- 至少在 Eclipse Neon / Groovy-Eclipse Plugin 2.9.2 中,代码完成/建议在以后在同一代码块中使用闭包时都不起作用=>所以据我所知没有任何损失
@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 } }
于 2018-04-06T08:25:57.480 回答