10.times 表示調用對象10的 times 方法(注 5),緊跟在這個調用後面的大括號裡面的部分就是Block。所謂 Block 是指緊跟在函數調用之後用大括號或 do/end 括起來的代碼,Block 的開始部分(左大括號或 do)必須和函數調用在同一行。Block 也可以接受參數,參數列表必須用兩個豎槓括起來放在最前面。Block 會被作為它前面的函數調用的參數,而在這個函數中可以使用關鍵字 yield 來調用該 Block。在這個例子中,10.times 會以數字0到9為參數調用 Block 10次。
Block 實際上就是匿名函數,它可以被調用,可以捕獲上下文。由於語法上要求 Block 必須出現在函數調用的後面,所以 Block 不能直接作為函數的的返回值。要想從一個函數中返回 Block,必須使用 proc 或 lambda 函數把 Block 轉化為對象才行。詳細內容請參考參考資源和3。
Python 中的閉包
Python 因其簡單易學、功能強大而擁有很多擁護者,很多企業和組織在使用這種語言。Python 使用縮進來區分作用域的做法也十分有特點。下面是一個 Python 的例子:
清單 6. Python 1
def addx(x):
def adder (y): return x + y
return adder
add8 = addx(8)
add9 = addx(9)
print add8(100)
print add9(100)
在 Python 中使用 def 來定義函數時,是必須有名字的,要想使用匿名函數,則需要使用lambda 語句,象下面的代碼這樣:
清單 7. Python 2
def addx(x):
return lambda y: x + y
add8 = addx(8)
add9 = addx(9)
print add8(100)
print add9(100)
Python 簡單易用且功能強大,關於 Python 的更多信息請參考參考資源。
Perl 中的閉包
Perl 是老牌文本處理語言了,在 WEB 開發方面也有一席之地。不過 Perl6 的開發進行比較慢,也許一些用戶開始轉投其它語言了。下面是一個 Perl 的例子。
清單 8. Perl
sub addx {
my $x = sit;
return sub { shift() + $x };
}
$add8 = addx(8);
$add9 = addx(9);
print $add8->(100);
print $add9->(100);
Lua 中的閉包
Lua 以其小巧和快速的特點受到 游戲開發 者的青睐,被一些游戲用來定制 UI 或作為插件語言,如果你玩過《魔獸世界》,那你對 Lua 一定不會感到陌生。前面在說明閉包原理時就使用了 Lua,這裡就不再給出其他的例子了。更多的內容請參考參考資源。