2012-05-08 15 views
6

¿Es posible tener una lista y usarla como argumento para una firma de cierre que en cambio tenga varias variables? La razón es que tengo que llamar a un cierre desde el código java, y el código java no sabrá qué variables necesita el cierre maravilloso.Groovy: lista de expansión en argumentos de cierre

Esto se mejora con un ejemplo.

Digamos que tengo un 'repositorio de cierre', donde cada cierre puede tener diferentes firmas. EG:

closures = [ 
    closureA: { int a, String b -> 
     a.times { 
      System.err.println(b); 
     } 
    }, 
    closureB: { int a, int b, String c -> 
     (a+b).times { 
      System.err.println(c); 
     } 
    } 
] 

Entonces tengo un método que estoy exponiendo a mi código Java para llamar a estos cierres:

def tryClosureExpansion(String whichClosure, Object ... args) { 
    def c = closures[whichClosure] 
    c.call(args)  // DOESNT COMPILE ! 
} 

Java Y me gustaría llamar a este método como este:

// these calls will happen from Java, not from Groovy 
tryClosureExpansion("closureA", 1, "Hello"); 
tryClosureExpansion("closureB", 1, 5, "Hello more"); 

Consulte arriba en la línea que no se compila. Siento que groovy es lo suficientemente "groovy" como para manejar algo como esto. ¿Alguna alternativa que pueda volar?

Respuesta

9

Hace:

c.call(*args) 

trabajo? No en la atmósfera de una computadora para probarlo

+2

Debería funcionar. Además, solo usar la sintaxis de llamada del método debería funcionar también: 'c (* args)'; pero puede aprovechar el método 'call' y usar el operador de navegación segura en caso de que el cierre no exista:' c? .call (* args) '(por supuesto, esto depende de su diseño, quizás lanzando una excepción en ese caso puede ser una mejor idea). – epidemian

+0

Gracias Tim, eso fue todo. Me pregunto dónde está documentado esto. Revisé las páginas de Operadores y Colecciones, y mencionan el operador de difusión, pero esto es un poco diferente ya que no especifica una acción en la lista. @epidemian - gracias, de hecho voy a verificar esta llamada y lanzar una excepción. –

+2

@RoyTruelove Se llama 'Operador de extensión'. Se usa para aplicar algo a varias entradas en una colección, o en este caso ampliar la lista [en múltiples parámetros] (http://jroller.com/aalmiray/entry/another_gem_from_groovy) –

Cuestiones relacionadas