È 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?
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
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. –
@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) –