在本页的最后一个示例(http://groovy.codehaus.org/JN3525-MetaClasses)中,覆盖metaClass invokeMethod调用的闭包代码引用了“委托”。代码也复制如下:
class Bird{
def name= 'Tweety'
def twirp(){ 'i taught i saw a puddy cat' }
}
Bird.metaClass.invokeMethod= {name, args->
def metaMethod= Bird.metaClass.getMetaMethod(name, args)
//'getMetaMethod' gets method, which may be an added or an existing one
metaMethod? metaMethod.invoke(delegate,args): 'no such method'
}
def a= new Bird()
assert a.twirp() == 'i taught i saw a puddy cat'
assert a.bleet() == 'no such method'
Bird.metaClass.getProperty= {name->
def metaProperty= Bird.metaClass.getMetaProperty(name)
//'getMetaProperty' gets property, which may be an added or an existing one
metaProperty? metaProperty.getProperty(delegate): 'no such property'
}
def b= new Bird()
assert b.name == 'Tweety'
assert b.filling == 'no such property'
代表来自哪里,两个代表什么?
它似乎引用了Bird类,但它如何适应Groovy闭包和整个语言的实现?
答案 0 :(得分:1)
它似乎引用了Bird类,但它如何适应Groovy闭包和整个语言的实现?
为了回答上述问题,它确实引用了Bird
的实例。它的行为类似于this
运算符,但在this
表示的包装对象的上下文之外。这可以通过一个小例子来解释:
Integer.metaClass.sayHello = {
return "Say hello $delegate times"
}
assert 2.sayHello() == "Say hello 2 times"
assert 20.sayHello() == "Say hello 20 times"
Integer.metaClass.sayHi = {
return "Say hello $this times"
}
println 2.sayHi()
如果您在Groovy Console中运行,请在最后一个println上标记。 this
运算符表示运行上述代码的脚本。
除了上述说明外,请访问我的评论中提供的链接。