2017-09-08 4 views
0

Ich schrieb den folgenden Code zu lernen Schließung/Methode Überschreiben in groovy. Ich konnte sein Verhalten nicht verstehen.Ich versuche zu verstehen, Laufzeit Schließung/Methode Überschreiben in 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()} 

Ich erwartete die beiden closure2 Anrufe das gleiche Ergebnis zu erzeugen, aber offenbar nicht, dass sie tun.

Unten ist das Ergebnis der Ausführung meines Codes.

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] 
} 

Antwort

0

Sie haben zwei verschiedene Dinge hier ... Eine Variable closure1 die einen Verschluss hält, und ein Verfahren closure1, die Sie zum Metaklasse über eine Schließung hinzugefügt haben ...

obj.closure2 (obj.closure1) 

fordert closure2 und geht in den variablen

obj.closure2 {obj.closure1()} 

gibt~~POS=HEADCOMP einen Verschluss, der den Verschluss in die Metaklasse aufruft

Sie sind sehr verschiedene Dinge

Sie haben gerade sie die gleiche

+0

Ah ... ich bin endlich klar jetzt genannt. Ich war verwirrt zwischen einer Methode und einer Eigenschaft (ein Closure-Objekt). Vielen Dank! –

Verwandte Themen