W Groovy's Closures - Formal Definition jest on nazywany "Przekazywanie zamknięć do metod".
Groovy ma specjalny przypadek do definiowania zamknięć jako argumentów metod, aby składnia zamknięcia była łatwiejsza do odczytania. W szczególności, jeśli ostatnim argumentem metody jest typ Zamknięcie, możesz wywołać metodę z jawnym blokiem zamknięcia poza nawiasem. Na przykład, jeśli klasa ma metodę:
class SomeCollection {
public void each (Closure c)
}
Następnie można powołać each() z definicji zamknięcia poza nawias:
SomeCollection stuff = new SomeCollection();
stuff.each() { println it }
bardziej tradycyjnych składnia jest również dostępny, a także pamiętać, że w Groovy można abstrahować nawias w wielu sytuacjach, więc te dwie odmiany są również prawny:
SomeCollection stuff = new SomeCollection();
stuff.each { println it } // Look ma, no parens
stuff.each ({ println it }) // Strictly traditional
Ta sama zasada ma zastosowanie nawet jeśli metoda ma inne argumenty. Jedynym ograniczeniem jest to, że argument Zamknięcie musi być ostatnia:
class SomeCollection {
public void inject (x, Closure c)
}
stuff.inject(0) { count, item -> count + item } // Groovy
stuff.inject(0, { count, item -> count + item }) // Traditional
które mogą nie być odpowiednie do „Groovy pytanie”, ale na przykład w Scala, to „forma” jest szczególnym przypadkiem funkcja curling:
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
Co sądzisz o [@mgryszko answer] (http://stackoverflow.com/a/10093625/462015) –
@ Arturo: myślałem o metodzie szablonów jako koniecznie obejmujących dziedziczenie, gdzie strategia była alternatywą dla niego, nie jego forma. http://tech.puredanger.com/2007/07/03/pattern-hate-template/ –
Co sądzisz o [moja własna odpowiedź] (http://stackoverflow.com/a/10306434/462015)? –