2013-03-05 14 views
28

C'è un modo per passare un metodo come parametro in Groovy senza avvolgerlo in una chiusura? Sembra funzionare con le funzioni, ma non con i metodi. Per esempio, dato il seguente:Metodo passo come parametro in Groovy

def foo(Closure c) { 
    c(arg1: "baz", arg2:"qux") 
} 

def bar(Map args) { 
    println('arg1: ' + args['arg1']) 
    println('arg2: ' + args['arg2']) 
} 

Questo funziona:

foo(bar) 

Ma se bar è un metodo in una classe:

class Quux { 
    def foo(Closure c) { 
     c(arg1: "baz", arg2:"qux") 
    } 

    def bar(Map args) { 
     println('arg1: ' + args['arg1']) 
     println('arg2: ' + args['arg2']) 
    } 

    def quuux() { 
     foo(bar) 
    } 
} 

new Quux().quuux() 

non riesce con No tali beni: bar per classe: Quux.

Se cambio il metodo per avvolgere bar in una chiusura, funziona, ma sembra inutilmente prolisso:

def quuux() { 
     foo({ args -> bar(args) }) 
    } 

C'è un modo più pulito?

risposta

46

.& operatore in soccorso!

class Quux { 
    def foo(Closure c) { 
     c(arg1: "baz", arg2:"qux") 
    } 

    def bar(Map args) { 
     println('arg1: ' + args['arg1']) 
     println('arg2: ' + args['arg2']) 
    } 

    def quuux() { 
     foo(this.&bar) 
    } 
} 

new Quux().quuux() 
// arg1: baz 
// arg2: qux 

In generale, obj.&method restituirà un metodo vincolato, cioè una chiusura che chiama method su obj.

Problemi correlati