2009-10-29 7 views
0

De SnipplrComment ajouter une nouvelle fermeture à une classe groovy

Ok est le code de script ici, dans les commentaires est la question et l'exception jeté

class Class1 { 
    def closure = { 
     println this.class.name 
     println delegate.class.name 
     def nestedClos = { 
      println owner.class.name 
     } 
     nestedClos() 
    } 
} 

def clos = new Class1().closure 
clos.delegate = this 
clos() 

//Now I want to add a new closure to Class1 

def newClosure = { 
    println "new Closure" 
    println this.class.name 
    println delegate.class.name 
    def nestedClos = { 
     println owner.class.name 
    } 
    nestedClos() 
} 

//getAbc to create a property, not a method 
Class1.metaClass.getAbc = newClosure 

//What happens here is that the property abc is not used as a closure per se, it's used 
//as a property and when I execute it just run the closure and when I want to change 
//the delegate, a null pointer is thrown 
clos = new Class1().abc //abc executed instead of passing the reference closure 
clos.delegate = this //Exception!!!! 
clos() 

Répondre

0

Ok, il est fait ce n'est pas un moyen chic, mais j'ai la solution .... ouais!

Créer la propriété comme objet, puis assignez la fermeture

class Class1 { 
    def closure = { 
     println this.class.name 
     println delegate.class.name 
     def nestedClos = { 
      println owner.class.name 
     } 
     nestedClos() 
    } 
} 

def clos = new Class1().closure 
clos.delegate = this 
clos() 

//Now I want to add a new closure to Class1 

def newClosure = { 
    println "new Closure" 
    println this.class.name 
    println delegate.class.name 
    def nestedClos = { 
     println owner.class.name 
    } 
    nestedClos() 
} 

//before edit 
//Class1.metaClass.abc = new Object() 
Class1.metaClass.abc = newClosure  


def cl = new Class1() 
//Before edit 
//For the sake of simplicity we are going to use & for the method 
//clos = cl.abc 
closs = cl.&abc 
clos.delegate = this 
clos() 
+0

Ok, ça marche mais je dois « mettre en œuvre » abc comme la fermeture avec toutes les instances ...... – jjchiw

Questions connexes