2012-08-22 14 views
9

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?

Respuesta

23

Puede pedir la maximumNumberOfParameters del cierre antes de llamar a:

def method(Closure c){ 
    def firstValue = 'a' 
    def secondValue = 'b' 
    if (c.maximumNumberOfParameters == 1) 
     c(firstValue) 
    else 
     c(firstValue, secondValue) 
} 

//execute 
method { a -> 
    println "I just need $a" 
} 
method { a, b -> 
    println "I need both $a and $b" 
} 

Salida:

I just need a 
I need both a and b 
2

Lo más sencillo es darle un valor por defecto:

method { a, b=nil -> 
    println "I just need $a" 
} 

También puede utilizar una matriz:

method { Object[] a -> 
    println "I just need $a" 
} 
+0

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

+0

@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. –

Cuestiones relacionadas