在Groovy的Closures - Formal Definition它只是被称为“传递闭包方法”。
Groovy有一个特殊的例子来定义闭包作为方法参数,使闭包语法更易于阅读。具体而言,如果方法的最后一个参数是Closure类型,则可以使用括号外的显式闭包模块调用该方法。例如,如果类具有的方法:
class SomeCollection {
public void each (Closure c)
}
然后,你可以调用与闭合定义中的每个()括号以外:
SomeCollection stuff = new SomeCollection();
stuff.each() { println it }
的更传统的语法也是可用的,并且还请注意,在Groovy中,你可以在许多情况下括号的Elid,所以这两个变化也是合法的:
SomeCollection stuff = new SomeCollection();
stuff.each { println it } // Look ma, no parens
stuff.each ({ println it }) // Strictly traditional
该规则同样适用,即使该方法具有其他参数。唯一的限制是,封闭参数必须是最后一个:
class SomeCollection {
public void inject (x, Closure c)
}
stuff.inject(0) { count, item -> count + item } // Groovy
stuff.inject(0, { count, item -> count + item }) // Traditional
这可能不相关的“常规问题”,但例如在Scala中,这种“形式”是一个特例功能柯里尔:
scala> def fun[A, B](a: A)(b: B) = {true}
fun: [A, B](a: A)(b: B)Boolean
scala> fun(1){2}
res59: Boolean = true
你怎么看待[@mgryszko答案](http://stackoverflow.com/a/10093625/462015) – 2012-04-18 21:53:08
@Arturo:我曾想过模板方法必然涉及继承,其中战略是一种替代方案,而不是它的一种形式。 http://tech.puredanger.com/2007/07/03/pattern-hate-template/ – 2012-04-19 19:21:54
你对[我自己的回答](http://stackoverflow.com/a/10306434/462015)有什么看法? – 2012-04-24 21:44:08