<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
    主站蜘蛛池模板: 亚洲A丁香五香天堂网| 亚洲国产日韩在线| 日本免费人成视频在线观看| 久久亚洲国产视频| 中字幕视频在线永久在线观看免费 | 99久9在线|免费| 亚洲AV无码一区二区三区电影| 国产成人精品久久亚洲| **毛片免费观看久久精品| 国产91成人精品亚洲精品| 亚洲爆乳无码专区| 成人性生交视频免费观看| 99久久婷婷免费国产综合精品| 2020年亚洲天天爽天天噜| 亚洲综合av永久无码精品一区二区| 久草视频免费在线| 羞羞视频免费网站在线看| 亚洲精品第一综合99久久| 久久精品国产亚洲AV麻豆王友容| 免费理论片51人人看电影| 污污网站18禁在线永久免费观看| 日韩欧美亚洲国产精品字幕久久久 | 亚洲国产精品丝袜在线观看| 97性无码区免费| 色www永久免费| 亚洲av日韩av永久在线观看| 亚洲乱亚洲乱淫久久| 亚洲国产精品成人| 在线观看免费大黄网站| 99re免费视频| 99久久国产精品免费一区二区| 精品一区二区三区免费毛片| 亚洲国产激情在线一区| 久久久久久亚洲精品| 奇米影视亚洲春色| 免费不卡中文字幕在线| 好男人视频在线观看免费看片 | 亚洲精品成a人在线观看| 国产午夜鲁丝片AV无码免费| 国产91色综合久久免费分享| 国产在线观a免费观看|