web-dev-qa-db-fra.com

Passer la méthode comme paramètre dans Groovy

Existe-t-il un moyen de passer une méthode en tant que paramètre dans Groovy sans l'envelopper dans une fermeture? Il semble fonctionner avec des fonctions, mais pas avec des méthodes. Par exemple, compte tenu des éléments suivants:

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

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

Cela marche:

foo(bar)

Mais si bar est une méthode dans une 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()

Il échoue avec Aucune propriété de ce type: barre pour la classe: Quux.

Si je change la méthode pour envelopper bar dans une fermeture, cela fonctionne, mais semble inutilement verbeux:

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

Existe-t-il un moyen plus propre?

38
David Moles

.& opérateur à la rescousse!

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

En général, obj.&method renverra une méthode liée, c'est-à-dire une fermeture qui appelle method sur obj.

62
epidemian