2017-09-08 4 views
0

J'ai écrit le code suivant pour apprendre l'écrasement de la fermeture/méthode dans groovy. Je ne pouvais pas comprendre son comportement.Essayer de comprendre la fermeture de l'exécution/l'écrasement des méthodes dans Groovy

class AClass { 
    def closure1 = { -> println "hello from closure1 - ${this.toString()}" } 

    def closure2 = { c1 -> 
     print "closure2 { \n " 
     c1() 
     println "}" 
    } 
} 

def obj = new AClass() 
print "1: " 
obj.closure1() 

//over write closure1 
obj.metaClass.closure1 = { -> println "hello from *** overridden closure1 *** - ${this.toString()}".toUpperCase()} 
print "\n2: " 
obj.closure1() //To confirm closure1 was indeed overwritten 

//call closure2 
print "\n3: " 
obj.closure2 (obj.closure1) 
print "\n4: " 
obj.closure2 {obj.closure1()} 

Je me attendais les deux appels closure2 pour générer le même résultat, mais apparemment ils ne sont pas.

Voici le résultat de l'exécution de mon code.

1: hello from closure1 - [email protected] 

2: HELLO FROM *** OVERRIDDEN CLOSURE1 *** - [email protected] 

3: closure2 { 
    hello from closure1 - [email protected] 
} 

4: closure2 { 
    HELLO FROM *** OVERRIDDEN CLOSURE1 *** - [email protected] 
} 

Répondre

0

Vous avez deux choses différentes ... Une closure1 variable qui tient une fermeture et une méthode closure1 que vous avez ajouté à la métaclasse via une fermeture ...

obj.closure2 (obj.closure1) 

Appels closure2 et passe dans la variable

obj.closure2 {obj.closure1()} 

adopte une fermeture qui appelle la fermeture dans la métaclasse

Ce sont des choses très différentes

Vous venez de les appelions même

+0

Ah ... Je suis enfin clair maintenant. J'étais confus entre une méthode et une propriété (un objet Closure). Je vous remercie! –