Me gustaría escribir un método que tome un Cierre como argumento y le pase argumentos, pero que escriba que el cierre puede especificar uno o dos argumentos como él prefieramétodo maravilloso que toma el cierre con uno o dos argumentos
traté de esta manera:
def method(Closure c){
def firstValue = 'a'
def secondValue = 'b'
c(firstValue, secondValue);
}
//execute
method { a ->
println "I just need $a"
}
method { a, b ->
println "I need both $a and $b"
}
Si intento ejecutar este código, el resultado es:
Caught: groovy.lang.MissingMethodException: No signature of method: clos2$_run_closure1.call() is applicable for argument types: (java.lang.String, java.lang.String) values: [a, b]
Possible solutions: any(), any(), dump(), dump(), doCall(java.lang.Object), any(groovy.lang.Closure)
at clos2.method(clos2.groovy:4)
at clos2.run(clos2.groovy:11)
¿Cómo puedo hacerlo?
No, también puedo declararlo y estar seguro de que _b_ tendrá un valor, el problema es que me gustaría no declararlo cuando escribo el cierre. Lo que me gustaría cambiar es el método, no los cierres – rascio
@rascio. No puede hacer eso sin saltar por los aros. Podrías verificar la longitud 'parametersTypes' del cierre para ver cuántos parametros toma, supongo, y llamarlo correctamente. Pero estás llamando específicamente un cierre que pasa * n * argumentos, a menos que hagas algo mágico y horrible, el cierre tendría que aceptarlos. –