快速业务通道

闭包的概念、形式与应用

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-07
身影,下面的代码就展示了一个 Block:


清单 5. Ruby

sum = 0
10.times{|n| sum = n}
print sum

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 的更多信息请参考参考资源.

Empire CMS,phome.net

Perl 中的闭包

Perl 是老牌文本处理语言了,在 WEB 开发方面也有一席之地.不过 Perl6 的开发进行比较慢,也许一些用户开始转投其它语言了.下面是一个 Perl 的例子.


清单 8. Perl

sub addx {
my $x = shift;
return sub { shift() $x };
}

$add8 = addx(8);
$add9 = addx(9);

print $add8->(100);
print $add9->(100);


Lua 中的闭包

Lua 以其小巧和快速的特点受到游戏开发者的青睐,被一些游戏用来定制 UI 或作为插件语言,如果你玩过《魔兽世界》,那你对 Lua 一定不会感到陌生.前面在说明闭包原理时就使用了 Lua,这里就不再给出其他的例子了.更多的内容请参考参考资源.

Scheme 中的闭包

Scheme 是 Lisp 的一种方言,被 MIT 用作教学语言.Scheme 属于函数语言,虽然不像命令语言那么流行,却是很多黑客喜欢的语言.很多编程思想起源于函数语言,闭包就是其中之一.一般认为 Scheme 是第一个提供完整闭包支持的语言.下面是一个 Scheme 的例子:


清单 9. Scheme

(define (addx x)
(lambda (y) ( y x)))

(define add8 (addx 8))
(define add9 (addx 9))

(add8 100)
(add9 100)


Scheme 的语法非常简单,只是有人觉得写法看起来比较古怪.有关 Scheme 更多信息请参考参考资源.

闭包的应用

闭包可以用优雅的方式来处理一些棘手的问题,有些程序员声称没有闭包简直就活不下去了.这虽然有些夸张,却从侧面说明闭包有着强大的功能.下面列举了一些闭包应用.

加强模块化

闭包有益于模块化编程,它能以简单的方式开发较小的模块,从而提高开发速度和程序的可复用性.和没有使用闭包的程序相比,使用闭包可将模块划分得更小.比如我们要计算一个数组中所有数字的和,这只需要循环遍历数组,把遍历到的数字加起来就行了.如果现在要计算所有元素的积呢?要打印所有的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号