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?
.&
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
.