我眼中的“閉包”
- 接觸閉包
- 什么是閉包
- 閉包的概念,不同資料給出了好幾種。
- 閉包:包含了自由(未綁定)變量的代碼塊,這些變量不是在這個代碼塊中或者任何全局上下文中定義的,而是定義代碼塊的環境中定義的。也就是下面兩部分:
- 要執行的代碼塊(由于自由變量存在,相關變量引用沒有釋放)
- 為自由變量提供綁定的計算環境(作用域)
- 閉包:一種函數對象或者匿名函數,作為參數傳遞,可以動態的創建與返回
- 閉包:具有閉合作用域的匿名函數
- 第一層理解:閉包是具有特別作用域規則且可以作為參數的代碼塊
- 第二層理解:給上述的代碼塊擴展一個參數列表,使方法或函數可以與這個代碼通訊
- 代碼說明:
['lions', 'tigers', 'bears'].each {|item| puts item}
Results:
lions
tigers
bears
- 第三層理解:將這樣的代碼塊作為參數傳遞
-
代碼說明:
animals = ['lions', 'tigers', 'bears'].collect {|item| item.upcase}
puts animals.join(" and ") + " oh, my."
LIONS and TIGERS and BEARS oh, my.
- 第四層理解:定義代碼塊的環境的名稱空間和使用它的函數之間的作用域本質上是一個作用域,即:作用域是閉合的
-
代碼說明:
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定義:閉包就是一個攜帶有本地狀態的函數
- 我對閉包的理解
- 閉包具有函數的性質
- 能完成一定的功能的代碼塊
- 能夠預定義參數和引用作用域中的參數
- 能夠在需要的地方被調用
- 閉包可以看成對象
- 作用域的作用
- 作用域設定一個運行空間,但是作用域本身也很無賴,作用域知道自己能干什么,但是不知道具體要怎么做。只要作用域真正要用的時候,見到了閉包里面的代碼塊,作用域才算功德圓滿了。這就是所謂“動態”的一種體現吧
- 作用域決定了閉包中代碼塊的使用方法
- 作用域決定了閉包中預設參數的本質,如參數的個數,類型
-
疑問:還沒有搞清楚一個問題,在這里請教一下知道的
在閉包里面作用域提供的參數 是怎么和閉包里面預設的參數一一對應起來的呢?見下面代碼
printMapClosure = {| key, value| puts key + "=" + value }
[ "yue" : "wu", "lane" : "burks", "sudha" : "saseethiaseeleethialeselan" ].each(printMapClosure)
result:yue=wu
lane=burks
sudha=saseethiaseeleethialeselan
我想知道為什么 key就對應yue,lane,sudha呢?而value就會對應wu,burks,sasee...呢?
不要告訴我是語義匹配這么高深的回答。呵呵 希望知道的人能給我說明白了怎么回事啊?指給我一些資料我也感激不盡啊。
- 作用域決定了閉包的最終處理結果
- 總結:閉包是一種被作用域限制的函數對象
- 另附:未來Java可能會采用的兩種閉包形式
- BGGA方案
-
說明:擴展了類型系統,引入了 function 類型,即函數都帶有一個類型參數列表、返回類型和 throws 子句。
代碼:完成求平方和
sumOfSquares = mapReduce(myBigCollection,
{ Double x => x * x },
{ Double x, Double y => x + y });
- CICE方案
-
說明:通過定義更簡化的內部類來完成對閉包的支持
代碼:完成求平方和
Double sumOfSquares = mapReduce(myBigCollection,
UnaryFunction<Double>(Double x) { return x*x; },
BinaryFunction<Double, Double>(Double x, Double y) { return x+y; });
- 附,參考資料
-
Java語言與實踐:閉包之爭 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(英文)
平凡而簡單的人一個,無權無勢也無牽無掛。一路廝殺,只進不退,死而后已,豈不爽哉!
收起對“車”日行千里的羨慕;收起對“馬”左右逢緣的感嘆;目標記在心里面,向前進。一次一步,一步一腳印,跬步千里。
這個角色很適合現在的我。
posted on 2007-09-19 17:45
過河卒 閱讀(2155)
評論(7) 編輯 收藏