2014-12-10 13 views
6

Dato seguente funzione Groovy:groovy: come passare vararg e chiusura nello stesso tempo a un metodo?

def foo(List<String> params, Closure c) {...} 

La chiamata di metodo sarebbe:

foo(['a', 'b', 'c']) { print "bar" } 

Ma vorrei per sbarazzarsi di staffe (List) nella chiamata di funzione. qualcosa di simile:

foo('a', 'b') { print "bar" } 

non posso cambiare il parametro nell'elenco per varargs perché varargs può essere solo l'ultimo parametro nella funzione (qui la chiusura è l'ultimo).

Qualche suggerimento?

risposta

4

Credo che questo solo potrebbe essere possibile se si utilizza una matrice come argomento o un Variable-Length Argument List:

def foo(Object... params) { 
    def closureParam = params.last() 
    closureParam() 
} 

foo('a', 'b') { print "bar" } 
+1

Questa è la soluzione che tendo ad evitare, perché non avrò più controllo sui tipi di parametri. si può inviare un intero o un altro oggetto invece di una stringa. – mhshams

8

Visto che è impossibile ottenere esattamente ciò che si vuole (è scritto nella documentazione Groovy che il tuo caso specifico è un problema, purtroppo stanno migrando i documenti in modo da non posso collegare direttamente in questo momento), che dire qualcosa in questo senso:

def foo(String... params) { 
    println params 
    return { Closure c -> 
     c.call() 
    } 
} 

foo('a', 'b') ({ println 'woot' }) 

ora è necessario mettere la chiusura in parantheses, ma non c'è bisogno usare più un array ..

3

C'è sempre Poor Man varargs ™

def foo(String p1,         Closure c) {foo [p1],    c} 
def foo(String p1, String p2,      Closure c) {foo [p1, p2],   c} 
def foo(String p1, String p2, String p3,   Closure c) {foo [p1, p2, p3],  c} 
def foo(String p1, String p2, String p3, String p4, Closure c) {foo [p1, p2, p3, p4], c} 
... 

sto scherzando solo a metà.

Problemi correlati