歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux系統:閉包的概念形式與應用(1)

Linux系統:閉包的概念形式與應用(1)

日期:2017/2/25 10:36:13   编辑:Linux教程
清單 3. 閉包示例3
function make_counter()
local count = 0
return function()
count = count + 1
return count
end
end
c1 = make_counter()
c2 = make_counter()
print(c1())
print(c2())

這裡使用了匿名函數。使用匿名函數能使代碼得到簡化,同時我們也不必挖空心思地去給一個不需要名字的函數取名字了。
上面簡單地介紹了閉包的原理,更多的閉包相關的概念和理論請參考參考資源中的"名字,作用域和約束"一章。
一個編程語言需要哪些特性來支持閉包呢,下面列出一些比較重要的條件:
函數是一階值;
函數可以嵌套定義;
可以捕獲引用環境,並
把引用環境和函數代碼組成一個可調用的實體;
允許定義匿名函數;
這些條件並不是必要的,但具備這些條件能說明一個編程語言對閉包的支持較為完善。另外需要注意,有些語言使用與函數定義不同的語法來定義這種能被傳遞的"函數",如 Ruby 中的 Block。這實際上是語法糖,只是為了更容易定義匿名函數而已,本質上沒有區別。
借用一個非常好的說法來做個總結(注 4):對象是附有行為的數據,而閉包是附有數據的行為。
閉包的表現形式
雖然建立在相似的思想之上,各種語言所實現的閉包卻有著不同的表現形式,下面我們來看一下閉包在一些常用語言中的表現形式。
Java Script 中的閉包
Java Script(ECMAScript)不是通用編程語言,但卻擁有較大的用戶群體,而 Ajax 的流行也使更多的人關注 JavaScript。雖然在進行 DOM 操作時容易引發循環引用問題,但 JavaScript 語言本身對閉包的支持還是很好的,下面是一個簡單的例子:
清單 4. JavaScript
function addx(x) {
return function(y) {return x+y;};
}
add8 = addx(8);
add9 = addx(9);
alert(add8(100));
alert(add9(100));

Ruby 中的閉包
隨著 Ruby on Rails 的走紅,Ruby 無疑是時下炙手可熱的語言之一,Ruby 吸取了很多其他語言的優點,是非常優秀的語言,從這一點來看,很難說清是 Rails 成就了 Ruby 還是 Ruby 成就了 Rails。
Ruby 使用 Block 來定義閉包,Block 在 Ruby 中十分重要,幾乎到處都可以看到它的身影,下面的代碼就展示了一個 Block:
清單 5. Ruby
sum = 0
10.times{|n| sum += n}
print sum
Copyright © Linux教程網 All Rights Reserved