这篇文章主要介绍了Perl闭包如何应用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
闭包的基本概念
闭包是可以包含自由(未绑定)变量的代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义。“闭包”一词来源于以下两者的结合:要执行的代码块(由于自由变量的存在,相关变量引用没有释放)和为自由变量提供绑定的计算环境(作用域)。在Scheme、CommonLisp、Smalltalk、Groovy、JavaScript、Ruby和Python等语言中都能找到对闭包不同程度的支持。
Perl闭包
闭包(closure)是个精确但又很难解释的电脑名词。在Perl里面,Perl闭包是以匿名函数的形式来实现,具有持续参照位于该函数范围之外的文字式变数值的能力。这些外部的文字变数会神奇地保留它们在闭包函数最初定义时的值(深连结)。
如果一个程式语言容许函数递回另一个函数的话(像Perl就是),Perl闭包便具有意义。要注意的是,有些语言虽提供匿名函数的功能,但却无法正确处理闭包;Python这个语言便是一例。如果要想多了解闭包的话,建议你去找本功能性程式设计的教科书来看。Scheme这个语言不仅支援闭包,更鼓励多加使用。
以下是个典型的产生函数的函数:
subadd_function_generator{ returnsub{shift+shift}; } $add_sub=add_function_generator(); $sum=&$add_sub(4,5);#$sum现在是9了
Perl闭包用起来就像是个函数样板,其中保留了一些可以在稍後再填入的空格。add_function_generator()所递回的匿名函数在技术上来讲并不能算是一个闭包,因为它没有用到任何位在这个函数范围之外的文字变数。
把上面这个例子和下面这个make_adder()函数对照一下,下面这个函数所递回的匿名函数中使用了一个外部的文字变数。这种指名外部函数的作法需要由Perl递回一个适当的闭包,因此那个文字变数在匿名函数产生之时的值便***地被锁进闭包里。
submake_adder{ my$addpiece=shift; returnsub{shift+$addpiece}; } $f1=make_adder(20); $f2=make_adder(555);
这样一来&$f1($n)永远会是20加上你传进去的值$n,而&$f2($n)将永远会是555加上你传进去的值$n。$addpiece的值会在闭包中保留下来。
Perl闭包在比较实际的场合中也常用得到,譬如当你想把一些程式码传入一个函数时:
my$line;
timeout(30,sub{$line=<STDIN>});
如果要执行的程式码当初是以字串的形式传入的话,即'$line=<STDIN>',那么timeout()这个假想的函数在回到该函数被呼叫时所在的范围後便无法再撷取$list这个文字变数的值了。
感谢你能够认真阅读完这篇文章,希望小编分享的“Perl闭包如何应用”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。