First they ignore you
          then they ridicule you
          then they fight you
          then you win
              -- Mahatma Gandhi
          Chinese => English     英文 => 中文             
          隨筆-221  評(píng)論-1047  文章-0  trackbacks-0
          曾經(jīng)很多Groovy開發(fā)者問我closure中的delegate是什么,有什么作用?

          其實(shí)closure中的delegate類似于類中的this,讓我們看一個(gè)小例子,大家就清楚了 :)

          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)
          }
          運(yùn)行結(jié)果:
          The?original?delegate?of?closure?is:?Script16@13e6346
          Hello,?山風(fēng)小子
          The?original?delegate?of?closure?is:?Script16@13e6346
          Hello,?山風(fēng)小子
          注意:可能大家運(yùn)行結(jié)果中的‘Script16@13e6346’部分各不相同,但都是Script開始的一個(gè)類名(我這里的類名為Script16)

          在類的實(shí)例方法中調(diào)用方法和引用屬性時(shí),我們可以省略方法或?qū)傩郧皌his(比如this.method(),this.property可簡寫為method(),property),
          表示調(diào)用或引用的是本實(shí)例的方法或?qū)傩浴?br />類似地,在closure中調(diào)用方法和引用屬性時(shí),我們也可以省略方法和屬性前的delegate,
          表示調(diào)用或引用的是本closure的方法或?qū)傩裕ǘ鴆losure通過delegate隱式變量將方法調(diào)用和變量引用‘委派’給了delegate引用的那個(gè)對(duì)象)

          那closure的delegate的默認(rèn)值是什么呢?默認(rèn)值是closure所在context中的this(為了方便理解起見,可以暫時(shí)這么記憶,因?yàn)閏losure套closure的情況不是很多見。其實(shí)closure的delegate的默認(rèn)值是closure的隱式變量owner,而owner通常引用closure所在context中的this,除非closure所處的context又是個(gè)closure,那么owner引用的就是那個(gè)外層的closure,關(guān)于closure中的owner,我將在下篇文章《Groovy解惑——closure中的owner》中進(jìn)行講解),讓我再用一個(gè)例子來說明一下吧:
          class?DelegateDemo?{
          ????String?author?
          =?"山風(fēng)小子"

          ????def?someMethod2(closure)?{
          ????????println?
          "The?original?delegate?of?closure?is:?${closure.delegate}"
          ????????
          //?無需設(shè)置closure.delegate,因?yàn)閏losure的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()

          運(yùn)行結(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ā)人員理解 :)
          由于第一個(gè)例子中的closure所處的context中的this是Script16.this,類Script16是沒有author屬性和greet方法的,所以我們必須設(shè)置delegate

          希望經(jīng)過我這么一解釋,大家對(duì)closure的delegate有所認(rèn)識(shí),清楚區(qū)分delegate和this :)


          附:朝花夕拾——Groovy & Grails


          posted on 2007-12-22 15:50 山風(fēng)小子 閱讀(5384) 評(píng)論(1)  編輯  收藏 所屬分類: Groovy & Grails
          主站蜘蛛池模板: 綦江县| 邢台市| 满城县| 凉城县| 抚松县| 阿坝县| 台北县| 游戏| 双峰县| 黑山县| 南投市| 上蔡县| 汪清县| 福海县| 云浮市| 太保市| 庄河市| 兴山县| 陈巴尔虎旗| 临武县| 筠连县| 甘谷县| 双辽市| 景泰县| 龙南县| 湘乡市| 浦北县| 抚松县| 南开区| 读书| 临桂县| 建始县| 瑞昌市| 望都县| 龙门县| 苏州市| 莎车县| 石渠县| 会宁县| 突泉县| 横峰县|