6
votes

Invoquer la méthode comme fermeture

Ma compréhension de l'opérateur groovy . & est qu'il convertit un appel de méthode à une fermeture. Par conséquent, il semble que le code suivant (qui puisse être exécuté dans le groovy console ) devrait fonctionner: xxx

Bien sûr, si je change la dernière ligne en xxx

Cela fonctionne bien, mais qu'est-ce qui ne va pas avec ma compréhension du . & opérateur?

merci, Don


0 commentaires

3 Réponses :


9
votes

Lors de la conversion d'une méthode en une fermeture en utilisant . & strong> notation que vous laissez désactiver les paramètres. F. & Méthode (6) est identique à celle de l'appelant F.Method (6) qui reviendra 16, donc dans votre exemple, vous passez 16 dans la invocation et non une fermeture. Qui provoque l'exception suivante car la classe entière n'a pas de méthode d'appel:

exception projetée: Aucune signature de la méthode: java.lang.integer.call () strong> p>

Ci-dessous transmet un pointeur de méthode pour F.Method dans InvokeClosure et ce que vous utiliseriez généralement. &. P> xxx pré>

Comme vous l'avez indiqué que les éléments suivants fonctionnent: P >

invokeClosure {f.method(6)}


1 commentaires

En fait, je pense strictement, je pense que {f.method (6)} est une fermeture qui prend un paramètre tandis que {-> f.method (6)} est une fermeture qui ne prend aucun paramètre. Grande réponse cependant, merci!



1
votes

Utiliser invokeclosure f. & Method.Curry (6) à la place. Ceci est une fermeture qui pourrait être appelée sans paramètres


0 commentaires

0
votes

L'exemple ci-dessus pourrait également être étendu pour prendre le paramètre en tant qu'argument dans la invoquation. Cela vous donnerait le résultat attendu et la syntaxe.

class Foo {
  def method(def param) {
    param + 10
  }
}

def invokeClosure = {Closure closure, def parameter ->
   return closure.call(parameter) 
}

def f = new Foo()
invokeClosure f.&method, 6


0 commentaires