<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    First they ignore you
    then they ridicule you
    then they fight you
    then you win
        -- Mahatma Gandhi
    Chinese => English     英文 => 中文             
    隨筆-221  評論-1047  文章-0  trackbacks-0
    曾經(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
    主站蜘蛛池模板: 在线综合亚洲欧洲综合网站| 一级成人生活片免费看| 午夜私人影院免费体验区| 青草青草视频2免费观看| 亚洲AV无码国产在丝袜线观看| 黄色片在线免费观看| 黄页网站在线免费观看| 亚洲日本中文字幕| 免费国产高清视频| 人妻丰满熟妇无码区免费 | 337p日本欧洲亚洲大胆人人| 国产国拍精品亚洲AV片| 日韩视频在线精品视频免费观看| 一级毛片高清免费播放| 自拍日韩亚洲一区在线| 亚洲国产精品一区二区第一页| 免费国产黄线在线观看| 日本道免费精品一区二区| 亚洲国产成人无码AV在线 | 亚洲AV无码之国产精品| 亚洲网站在线观看| 亚洲国产精品13p| 毛片免费在线播放| 久久国产免费一区| 亚洲一级片免费看| 亚洲aⅴ无码专区在线观看| 亚洲国产精品VA在线看黑人| 又大又硬又爽免费视频| 免费看污成人午夜网站| 久久免费观看国产精品| 又大又硬又粗又黄的视频免费看| 亚洲va在线va天堂成人| 亚洲国产综合精品中文第一区| 亚洲毛片网址在线观看中文字幕| 女人让男人免费桶爽30分钟| 222www免费视频| 亚洲免费人成在线视频观看 | 99精品免费观看| 国产免费一区二区三区不卡| 欧亚一级毛片免费看| 日韩精品亚洲专区在线影视|