2013-03-05 15 views
28

Czy istnieje sposób przekazania metody jako parametru w Groovy bez owijania jej w zamknięciu? Wydaje się, że działa z funkcjami, ale nie z metodami. Na przykład, biorąc pod uwagę następujące elementy:Metoda przekazywania jako parametr w Groovy

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

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

to działa:

foo(bar) 

Ale jeśli bar to metoda w klasie:

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() 

nie powiedzie się z Brak takiej własności: bar dla klasy: Quux.

Gdybym zmienić metodę zawinąć bar w zamknięciu, to działa, ale wydaje się niepotrzebnie gadatliwy:

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

Czy istnieje przejrzysty sposób?

Odpowiedz

46

.& operator na ratunek!

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 

Ogólnie obj.&method zwróci związanego sposób, to jest zamknięcie, które wywołuje method na obj.

Powiązane problemy