2012-05-08 10 views
6

È possibile avere un elenco e utilizzarlo come argomento per una firma di chiusura che invece contiene più variabili? La ragione è che devo chiamare una chiusura dal codice java, e il codice java non saprà quali variabili richieda la chiusura groovy.Groovy - elenco di espansione in argomenti di chiusura

Questo è meglio servito con un esempio.

Dire che ho un 'archivio di chiusura', dove ogni chiusura potrebbe avere diverse firme. 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); 
     } 
    } 
] 

Poi ho un metodo che sto esponendo al mio codice Java di chiamare queste chiusure:

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

Ed Java mi piacerebbe chiamare questo metodo come questo:

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

Vedere sopra sulla riga che non viene compilata. Mi sento come se fosse groovy abbastanza "groovy" da poter gestire qualcosa di simile. Qualche alternativa che potrebbe volare?

risposta

9

Does:

c.call(*args) 

lavoro? Non al computer per testarlo

+2

Dovrebbe funzionare. Inoltre, dovrebbe funzionare anche la sintassi della chiamata del metodo: 'c (* args)'; ma puoi trarre vantaggio dal metodo 'call' e usare l'operatore di navigazione sicura nel caso in cui la chiusura non esista:' c? .call (* args) '(ovviamente, questo dipende dal tuo progetto, magari lanciando un'eccezione su quel caso potrebbe essere un'idea migliore). – epidemian

+0

Grazie Tim, l'ha fatto. Mi chiedo dove questo è documentato? Ho controllato le pagine Operators e Collections e menzionano l'operatore di spread, ma questo è un po 'diverso in quanto non specifica un'azione nella lista. @epidemian - grazie, in realtà sto andando a controllare prima di questa chiamata e lanciare un'eccezione. –

+2

@RoyTruelove Si chiama 'Spread Operator'. È usato per applicare qualcosa a più voci in una COllection, o in questo caso espandere l'elenco [in più parametri] (http://jroller.com/aalmiray/entry/another_gem_from_groovy) –

Problemi correlati