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

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

日期:2017/2/25 10:36:13   编辑:Linux教程
Scheme 是 Lisp 的一種方言,被 MIT 用作教學語言。Scheme 屬於函數語言,雖然不像命令語言那麼流行,卻是很多黑客喜歡的語言。很多編程思想起源於函數語言,閉包就是其中之一。一般認為 Scheme 是第一個提供完整閉包支持的語言。下面是一個 Scheme 的例子:
清單 9. Sceme
(define (addx x)
(lambda (y) (+ y x)))
(define add8 (addx 8))
(define add9 (addx 9))
(add8 100)
(add9 100)
Scheme 的語法非常簡單,只是有人覺得寫法看起來比較古怪。有關 Scheme 更多信息請參考參考資源。
閉包的應用
閉包可以用優雅的方式來處理一些棘手的問題,有些程序員聲稱沒有閉包簡直就活不下去了。這雖然有些誇張,卻從側面說明閉包有著強大的功能。下面列舉了一些閉包應用。
加強模塊化
閉包有益於模塊化編程,它能以簡單的方式開發較小的模塊,從而提高開發速度和程序的可復用性。和沒有使用閉包的程序相比,使用閉包可將模塊劃分得更小。比如我們要計算一個數組中所有數字的和,這只需要循環遍歷數組,把遍歷到的數字加起來就行了。如果現在要計算所有元素的積呢?要打印所有的元素呢?解決這些問題都要對數組進行遍歷,如果是在不支持閉包的語言中,我們不得不一次又一次重復地寫循環語句。而這在支持閉包的語言中是不必要的,比如對數組求和的操作在 Ruby 中可以這樣做:
清單 10. 加強模塊化
nums = [10,3,22,34,17]
sum = 0
nums.each{|n| sum += n}
print sum

這種處理方法多少有點像我們熟悉的回調函數,不過要比回調函數寫法更簡單,功能更強大。因為在閉包裡引用環境是函數定義時的環境,所以在閉包裡改變引用環境中變量的值,直接就可以反映到它定義時的上下文中,這是通常的回調函數所不能做到的。這個例子說明閉包可以使我們把模塊劃分得更小。
抽象
閉包是數據和行為的組合,這使得閉包具有較好抽象能力,下面的代碼通過閉包來模擬面向對象編程。函數 make_stack 用來生成 stack 對象,它的返回值是一個閉包,這個閉包作為一個 Dispatcher,當以 “push” 或 “pop” 為參數調用時,返回一個與函數 push 或 pop 相關聯的閉包,進而可以操作 data 中的數據。
清單 11. 抽象
function make_stack()
local data = {};
local last = -1;
local function pus(e)
last = last + 1;
data[last] = e;
end
local function pop()
if last == -1 ten
return nil
end
last = last - 1
return data[last+1]
end
return function (index)
local tb = {push=push, pop=pop}
return tb[index]
end
Copyright © Linux教程網 All Rights Reserved