2009-10-29 23 views
0

一类从Snipplr如何将一个新的闭包添加到常规

确定这里是脚本代码,在注释中的问题,并抛出

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() 

回答

0

好之外,它的完成它不是一种奇特的方式,但我有解决方案....是啊!

创建属性作为对象,以后分配封闭

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

好,它的工作原理,但我需要“落实” ABC一样关闭所有的情况...... – jjchiw 2009-10-29 13:37:54

相关问题