首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是groovy闭包的自动委托?

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

Stack Overflow用户
提问于 2013-07-10 03:00:02
回答 1查看 492关注 0票数 0

在本页面的最后一个示例(http://groovy.codehaus.org/JN3525-MetaClasses)中,覆盖metaClass invokeMethod调用的闭包代码引用了一个“委托”。下面还复制了代码:

代码语言:javascript
复制
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闭包和语言的整体实现呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-10 03:29:35

它似乎引用了Bird类,但是它如何适合Groovy闭包和语言的整体实现呢?

要回答上面的问题,请参考Bird的实例。它的行为类似于this操作符,但在由this表示的包装对象的上下文之外。这可以用一个小例子来解释:

代码语言:javascript
复制
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控制台中运行,请在最后一个println处标记。this运算符表示在其上运行上述代码的脚本。

除了上面的解释,请务必访问我的评论中提供的链接。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17556111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档