posts - 110,  comments - 152,  trackbacks - 0

          我眼中的“閉包”

          • 接觸閉包
            •        接觸編程以來,接觸過好幾種編程語言中都提到了閉包這個語言特性,Javascript,Ruby,Perl。最近在看關(guān)于Groovy的 時(shí)候也突出談了閉包這個特性。Search了一下各大搜索引擎,發(fā)現(xiàn)Java里面也開始討論要不要在后續(xù)版本里面加入閉包的特性了。由此可見閉包這個特 性,如何的吸引人。閑話少說,直接來看閉包吧!
                      下面的主要內(nèi)容來源于各個搜索引擎。我只是整理了一下,找出一個最便于我自己理解的版本表述如下,可能在你看來這些理解是有失偏頗的,請你不要吝惜的告訴我。參考資料列表會附在后面,有興趣可以直接讀那些資料。

          • 什么是閉包
            • 閉包的概念,不同資料給出了好幾種。
            • 閉包:包含了自由(未綁定)變量的代碼塊,這些變量不是在這個代碼塊中或者任何全局上下文中定義的,而是定義代碼塊的環(huán)境中定義的。也就是下面兩部分:
              • 要執(zhí)行的代碼塊(由于自由變量存在,相關(guān)變量引用沒有釋放)
              • 為自由變量提供綁定的計(jì)算環(huán)境(作用域)
            • 閉包:一種函數(shù)對象或者匿名函數(shù),作為參數(shù)傳遞,可以動態(tài)的創(chuàng)建與返回
            • 閉包:具有閉合作用域的匿名函數(shù)
              • 第一層理解:閉包是具有特別作用域規(guī)則且可以作為參數(shù)的代碼塊
                • 代碼說明:
                  3.times {puts "Inside the times method."}

                  Results:
                  Inside the times method.
                  Inside the times method.
                  Inside the times method.

              • 第二層理解:給上述的代碼塊擴(kuò)展一個參數(shù)列表,使方法或函數(shù)可以與這個代碼通訊
                • 代碼說明:
                  ['lions', 'tigers', 'bears'].each {|item| puts item}

                  Results:
                  lions
                  tigers
                  bears
              • 第三層理解:將這樣的代碼塊作為參數(shù)傳遞
                • 代碼說明:
                  animals = ['lions', 'tigers', 'bears'].collect {|item| item.upcase}
                  puts animals.join(" and ") + " oh, my."

                  LIONS and TIGERS and BEARS oh, my.

              • 第四層理解:定義代碼塊的環(huán)境的名稱空間和使用它的函數(shù)之間的作用域本質(zhì)上是一個作用域,即:作用域是閉合的
                • 代碼說明:
                  tax = 0.08
                  prices = [4.45, 6.34, 3.78]
                  tax_table = prices.collect {|price| {:price => price, :tax => price * tax}}
                  tax_table.collect {|item| puts "Price: #{item[:price]}    Tax: #{item[:tax]}"}

                  Results:
                  Price: 4.45    Tax: 0.356
                  Price: 6.34    Tax: 0.5072
                  Price: 3.78    Tax: 0.3024

            • 按照SCIP定義:閉包就是一個攜帶有本地狀態(tài)的函數(shù)
          • 我對閉包的理解
            • 閉包具有函數(shù)的性質(zhì)
              • 能完成一定的功能的代碼塊
              • 能夠預(yù)定義參數(shù)和引用作用域中的參數(shù)
              • 能夠在需要的地方被調(diào)用
            • 閉包可以看成對象
              • 能夠作為參數(shù)傳遞
            • 作用域的作用
              • 作用域設(shè)定一個運(yùn)行空間,但是作用域本身也很無賴,作用域知道自己能干什么,但是不知道具體要怎么做。只要作用域真正要用的時(shí)候,見到了閉包里面的代碼塊,作用域才算功德圓滿了。這就是所謂“動態(tài)”的一種體現(xiàn)吧
              • 作用域決定了閉包中代碼塊的使用方法
              • 作用域決定了閉包中預(yù)設(shè)參數(shù)的本質(zhì),如參數(shù)的個數(shù),類型
                • 疑問:還沒有搞清楚一個問題,在這里請教一下知道的  
                  在閉包里面作用域提供的參數(shù) 是怎么和閉包里面預(yù)設(shè)的參數(shù)一一對應(yīng)起來的呢?見下面代碼
                  printMapClosure = {| key, value| puts key + "=" + value }
                  [ "yue" : "wu", "lane" : "burks", "sudha" : "saseethiaseeleethialeselan" ].each(printMapClosure)
                  result:yue=wu
                  lane=burks
                  sudha=saseethiaseeleethialeselan
                  我想知道為什么 key就對應(yīng)yue,lane,sudha呢?而value就會對應(yīng)wu,burks,sasee...呢?
                  不要告訴我是語義匹配這么高深的回答。呵呵  希望知道的人能給我說明白了怎么回事啊?指給我一些資料我也感激不盡啊。

              • 作用域決定了閉包的最終處理結(jié)果
            • 總結(jié):閉包是一種被作用域限制的函數(shù)對象
          • 另附:未來Java可能會采用的兩種閉包形式
            • BGGA方案
              • 說明:擴(kuò)展了類型系統(tǒng),引入了 function 類型,即函數(shù)都帶有一個類型參數(shù)列表、返回類型和 throws 子句。

                代碼:完成求平方和
                sumOfSquares = mapReduce(myBigCollection,
                { Double x => x * x },
                { Double x, Double y => x + y });

            • CICE方案
              • 說明:通過定義更簡化的內(nèi)部類來完成對閉包的支持

                代碼:完成求平方和
                Double sumOfSquares = mapReduce(myBigCollection,
                UnaryFunction<Double>(Double x) { return x*x; },
                BinaryFunction<Double, Double>(Double x, Double y) { return x+y; });

          • 附,參考資料
            • Java語言與實(shí)踐:閉包之爭 http://www.ibm.com/developerworks/cn/java/j-jtp04247.html

              跨越邊界:閉包 http://www.ibm.com/developerworks/cn/java/j-cb01097.html

              MartinFowler說閉包
              http://blog.csdn.net/limux/archive/2005/07/05/413911.aspx (中文)
              http://martinfowler.com/bliki/Closure.html(英文)



          平凡而簡單的人一個,無權(quán)無勢也無牽無掛。一路廝殺,只進(jìn)不退,死而后已,豈不爽哉!
          收起對“車”日行千里的羨慕;收起對“馬”左右逢緣的感嘆;目標(biāo)記在心里面,向前進(jìn)。一次一步,一步一腳印,跬步千里。
          這個角色很適合現(xiàn)在的


          posted on 2007-09-19 17:45 過河卒 閱讀(2155) 評論(7)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          文章來自: http://www.blogjava.com/ponzmd/ (彭俊-過河卒) 轉(zhuǎn)貼請聲明!
          訪問統(tǒng)計(jì):
          主站蜘蛛池模板: 汕尾市| 原平市| 靖宇县| 库车县| 天津市| 麦盖提县| 蕉岭县| 莒南县| 区。| 平乡县| 穆棱市| 宁明县| 宾阳县| 会理县| 宁蒗| 陈巴尔虎旗| 临夏县| 武乡县| 枣强县| 巍山| 永州市| 将乐县| 吉木萨尔县| 彩票| 黑水县| 威海市| 同江市| 炉霍县| 广宗县| 仁化县| 屯留县| 叙永县| 久治县| 宿迁市| 治县。| 金阳县| 蒲城县| 延边| 张北县| 内丘县| 吕梁市|