Estos son los métodos de civil pero siguen un patrón específico bastante - toman un Closure
como su último argumento. Un Cierre es una funcionalidad que puede pasar y llamar cuando corresponda.
Por ejemplo, el método eachWithIndex podría tener este aspecto (más o menos):
void eachWithIndex(Closure operation) {
for (int i = 0; this.hasNext(); i++) {
operation(this.next(), i); // Here closure passed as parameter is being called
}
}
Este enfoque permite a uno construir algoritmos genéricos (como iteración sobre material) y cambiar la lógica de procesamiento de hormigón en tiempo de ejecución mediante el paso diferentes cierres .
En cuanto a la parte de parámetros, como puede ver en el ejemplo anterior, llamamos al cierre (operation
) con dos parámetros: el elemento actual y el índice actual. Esto significa que el método eachWithIndex espera recibir no solo un cierre sino uno que acepte estos dos parámetros. A partir de una sintaxis prospectivo de un define los parámetros durante la definición del cierre de la siguiente manera:
{ elem, index ->
// logic
}
Así ->
se utiliza para separar los argumentos parte de la definición de cierre de su lógica.Cuando un cierre toma solo un argumento, su definición de parámetro puede ser omitida y luego el parámetro será accesible dentro del alcance del cierre con el nombre it
(nombre implícito para el primer argumento). Por ejemplo:
[1,2,3].each {
println it
}
Se podría reescribirse así:
[1,2,3].each({ elem ->
println elem
})
Como se ve el lenguaje Groovy añade un poco de azúcar sintaxis para hacer tales construcciones se ven más bonitas.
Si num IDX y están siendo considerados como argumentos para el cierre/función, desde donde exactamente están recibiendo los valores dentro de ellos? Quiero decir, ¿cómo está sacando num 5,7,9,12 y cómo está tomando idx 0,1,2,3? –
El método 'eachWithIndex' ejecuta el cierre por cada elemento en la lista, teniendo la plena responsabilidad de los argumentos de cierre. Mire la implementación 'eachWithIndex'. –