新聞中心
本文和大家重點(diǎn)學(xué)習(xí)一下Perl閉包的概念,閉包(closure)是個(gè)精確但又很難解釋的電腦名詞。在Perl里面,Perl閉包是以匿名函數(shù)的形式來(lái)實(shí)現(xiàn),具有持續(xù)參照位于該函數(shù)范圍之外的文字式變數(shù)值的能力。

閉包的基本概念
閉包是可以包含自由(未綁定)變量的代碼塊;這些變量不是在這個(gè)代碼塊或者任何全局上下文中定義的,而是在定義代碼塊的環(huán)境中定義?!伴]包”一詞來(lái)源于以下兩者的結(jié)合:要執(zhí)行的代碼塊(由于自由變量的存在,相關(guān)變量引用沒(méi)有釋放)和為自由變量提供綁定的計(jì)算環(huán)境(作用域)。在Scheme、CommonLisp、Smalltalk、Groovy、JavaScript、Ruby和Python等語(yǔ)言中都能找到對(duì)閉包不同程度的支持。
Perl閉包
閉包(closure)是個(gè)精確但又很難解釋的電腦名詞。在Perl里面,Perl閉包是以匿名函數(shù)的形式來(lái)實(shí)現(xiàn),具有持續(xù)參照位于該函數(shù)范圍之外的文字式變數(shù)值的能力。這些外部的文字變數(shù)會(huì)神奇地保留它們?cè)陂]包函數(shù)最初定義時(shí)的值(深連結(jié))。
如果一個(gè)程式語(yǔ)言容許函數(shù)遞回另一個(gè)函數(shù)的話(huà)(像Perl就是),Perl閉包便具有意義。要注意的是,有些語(yǔ)言雖提供匿名函數(shù)的功能,但卻無(wú)法正確處理閉包;Python這個(gè)語(yǔ)言便是一例。如果要想多了解閉包的話(huà),建議你去找本功能性程式設(shè)計(jì)的教科書(shū)來(lái)看。Scheme這個(gè)語(yǔ)言不僅支援閉包,更鼓勵(lì)多加使用。
以下是個(gè)典型的產(chǎn)生函數(shù)的函數(shù):
- subadd_function_generator{
- returnsub{shift+shift};
- }
- $add_sub=add_function_generator();
- $sum=&$add_sub(4,5);#$sum現(xiàn)在是9了
Perl閉包用起來(lái)就像是個(gè)函數(shù)樣板,其中保留了一些可以在稍後再填入的空格。add_function_generator()所遞回的匿名函數(shù)在技術(shù)上來(lái)講并不能算是一個(gè)閉包,因?yàn)樗鼪](méi)有用到任何位在這個(gè)函數(shù)范圍之外的文字變數(shù)。
把上面這個(gè)例子和下面這個(gè)make_adder()函數(shù)對(duì)照一下,下面這個(gè)函數(shù)所遞回的匿名函數(shù)中使用了一個(gè)外部的文字變數(shù)。這種指名外部函數(shù)的作法需要由Perl遞回一個(gè)適當(dāng)?shù)拈]包,因此那個(gè)文字變數(shù)在匿名函數(shù)產(chǎn)生之時(shí)的值便***地被鎖進(jìn)閉包里。
- submake_adder{
- my$addpiece=shift;
- returnsub{shift+$addpiece};
- }
- $f1=make_adder(20);
- $f2=make_adder(555);
這樣一來(lái)&$f1($n)永遠(yuǎn)會(huì)是20加上你傳進(jìn)去的值$n,而&$f2($n)將永遠(yuǎn)會(huì)是555加上你傳進(jìn)去的值$n。$addpiece的值會(huì)在閉包中保留下來(lái)。
Perl閉包在比較實(shí)際的場(chǎng)合中也常用得到,譬如當(dāng)你想把一些程式碼傳入一個(gè)函數(shù)時(shí):
my$line;
timeout(30,sub{$line=
如果要執(zhí)行的程式碼當(dāng)初是以字串的形式傳入的話(huà),即'$line=
網(wǎng)站欄目:深入理解Perl閉包及其應(yīng)用
當(dāng)前鏈接:http://fisionsoft.com.cn/article/cosisjj.html


咨詢(xún)
建站咨詢(xún)
