曾經(jīng)很多Groovy開發(fā)者問我closure中的delegate是什么,有什么作用?
其實
closure中的delegate類似于類中的this,讓我們看一個小例子,大家就清楚了 :)
class?DelegateDemo?{
????String?author?=?"山風(fēng)小子"
????def?someMethod(closure)?{
????????println?"The?original?delegate?of?closure?is:?${closure.delegate}"
????????closure.delegate?=?this
????????closure()
????}
????def?greet(words)?{
????????println?words
????}
}
def?delegateDemo?=?new?DelegateDemo()
delegateDemo.someMethod?{
????//?此處的delegate可以省略
????delegate.greet("Hello,?"?+?delegate.author)
}
delegateDemo.someMethod?{
????//?省略了delegate
????greet("Hello,?"?+?author)
}
運行結(jié)果:
The?original?delegate?of?closure?is:?Script16@13e6346
Hello,?山風(fēng)小子
The?original?delegate?of?closure?is:?Script16@13e6346
Hello,?山風(fēng)小子
注意:可能大家運行結(jié)果中的‘
Script16@13e6346’部分各不相同,但都是Script開始的一個類名(我這里的類名為Script16)
在類的實例方法中調(diào)用方法和引用屬性時,我們可以省略方法或?qū)傩郧皌his(比如this.method(),this.property可簡寫為method(),property),
表示調(diào)用或引用的是本實例的方法或?qū)傩浴?br />類似地,在closure中調(diào)用方法和引用屬性時,我們也可以省略方法和屬性前的delegate,
表示調(diào)用或引用的是本closure的方法或?qū)傩裕ǘ鴆losure通過delegate隱式變量將方法調(diào)用和變量引用‘委派’給了delegate引用的那個對象)
那closure的delegate的默認(rèn)值是什么呢?默認(rèn)值是closure所在context中的this(
為了方便理解起見,可以暫時這么記憶,因為closure套closure的情況不是很多見。其實closure的delegate的默認(rèn)值是closure的隱式變量owner,而owner通常引用closure所在context中的this,除非closure所處的context又是個closure,那么owner引用的就是那個外層的closure,關(guān)于closure中的owner,我將在下篇文章《Groovy解惑——closure中的owner》中進行講解),讓我再用一個例子來說明一下吧:
class?DelegateDemo?{
????String?author?=?"山風(fēng)小子"
????def?someMethod2(closure)?{
????????println?"The?original?delegate?of?closure?is:?${closure.delegate}"
????????//?無需設(shè)置closure.delegate,因為closure的delegate默認(rèn)值已經(jīng)是DelegateDemo.this
????????//closure.delegate?=?this
????????closure()
????}
????def?greet(words)?{
????????println?words
????}
????def?test()?{
????????def?delegateDemo?=?new?DelegateDemo()
????????//?傳入someMethod2的closure?{
}?所處的context的this是DelegateDemo.this
????????//?所以closure的delegate的默認(rèn)值也是DelegateDemo.this
????????delegateDemo.someMethod2?{
????????????//?此處的delegate可以省略
????????????delegate.greet("Hello,?"?+?delegate.author)
????????}
????????delegateDemo.someMethod2?{
????????????//?省略了delegate
????????????greet("Hello,?"?+?author)
????????}
????}
}
def?dd?=?new?DelegateDemo()
dd.test()
運行結(jié)果:
The?original?delegate?of?closure?is:?DelegateDemo@1b5d2b2
Hello,?山風(fēng)小子
The?original?delegate?of?closure?is:?DelegateDemo@1b5d2b2
Hello,?山風(fēng)小子
注意DelegateDemo.this是Java中的表示方法,在Groovy并不支持,這么寫是為了方便Java開發(fā)人員理解 :)
由于第一個例子中的closure所處的context中的this是Script16.this,類Script16是沒有author屬性和greet方法的,所以我們必須設(shè)置delegate
希望經(jīng)過我這么一解釋,大家對closure的delegate有所認(rèn)識,清楚區(qū)分delegate和this :)
附:
朝花夕拾——Groovy & Grails
posted on 2007-12-22 15:50
山風(fēng)小子 閱讀(5370)
評論(1) 編輯 收藏 所屬分類:
Groovy & Grails