繁体   English   中英

groovy闭包的自动委托是什么?

[英]What is the automatic delegate of a groovy closure?

在此页面的最后一个示例( 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闭包和整个语言的实现?

它似乎引用了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运算符表示您在其上运行以上代码的脚本。

除了上述说明之外,请访问我评论中提供的链接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM