扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:中国IT实验室 来源:中国IT实验室 2007年9月30日
关键字:
在本页阅读全文(共2页)
到目前为止,迭代是闭包在 Ruby 中最常见的用法,但闭包在这方面的用法远不止使用集合内置的闭包这一种。想想您每天使用的集合的类型。XML 文档是元素集。Web 页面是特殊的 XML 集。数据库由表组成,而表又由行组成。文件是字符集或字节集,通常也是多行文本或对象的集合。Ruby 在闭包中很好地解决了这几个问题。您已经见过了几个对集合进行迭代的例子。清单 11 给出了一个对数据库表进行遍历的示例闭包:
清单 11. 对数据库的行进行遍历
require 'mysql' db=Mysql.new("localhost", "root", "password") db.select_db("database") result = db.query "select * from words" result.each {|row| do_something_with_row} db.close |
清单 11 中的代码也带出了另一种可能的应用。MySQL API 迫使用户建立数据库并使用 close
方法关闭数据库。实际上可以使用闭包代替该方法来建立和清除资源。Ruby 开发人员常用这种模式来处理文件等资源。使用这个 Ruby API,无需打开或关闭文件,也无需管理异常。File
类的方法会为您处理这一切。您可以使用闭包来替换该方法,如清单 12 所示:
清单 12. 使用闭包操作 File
File.open(name) {|file| process_file(f)} |
闭包还有一项重大的优势:让实施策略变得容易。例如,若要处理一项事务,采用闭包后,您就能确保事务代码总能由适当的函数调用界定。框架代码能处理策略,而在闭包中提供的用户代码能定制此策略。清单 13 是基本的使用模式:
清单 13. 实施策略
def do_transaction begin setup_transaction yield commit_transaction rescue roll_back_transaction end end |
Java 语言中的闭包
Java 语言本身还没有正式支持闭包,但它却允许模拟闭包。可以使用匿名的内部类来实现闭包。和 Ruby 使用这项技术的原因差不多,Spring 框架也使用这项技术。为保持持久性,Spring 模板允许对结果集进行迭代,而无需关注异常管理、资源分配或清理等细节,从而为用户减轻了负担。清单 14 的例子取自于 Spring 框架的示例宠物诊所应用程序:
清单 14. 使用内部类模拟闭包
JdbcTemplate template = new JdbcTemplate(dataSource); final List names = new LinkedList(); template.query("SELECT id,name FROM types ORDER BY name", new RowCallbackHandler() { public void processRow(ResultSet rs) throws SQLException { names.add(rs.getString(1)); } }); |
编写清单 14 中的代码的程序员不再需要做如下这些事:
程序员们不用再为这些问题烦恼,因为该框架会处理它们。但匿名内部类只是宽泛地近似于闭包,它们并没有深入到您需要的程度。请看清单 14 中多余的句子结构。这个例子中的代码至少一半是支持性代码。匿名类就像是满满一桶冰水,每次用的时候都会洒到您的腿上。多余句子结构所需的过多的额外处理阻碍了对匿名类的使用。您迟早会放弃。当语言结构既麻烦又不好用时,人们自然不会用它。缺乏能够有效使用匿名内部类的 Java 库使问题更为明显。要想使闭包在 Java 语言中实践并流行起来,它必须要敏捷干净。
过去,闭包绝不是 Java 开发人员优先考虑的事情。在早期,Java 设计人员并不支持闭包,因为 Java 用户对无需显式完成 new 操作就在堆上自动分配变量心存芥蒂(参见 参考资料)。 如今,围绕是否将闭包纳入到基本语言中存在极大的争议。最近几年来,动态语言(如 Ruby、JavaScript,甚至于 Lisp )的流行让将闭包纳入 Java 语言的支持之声日益高涨。从目前来看,Java 1.7 最终很可能会采纳闭包。只要不断跨越边界,总会好事连连。
关于作者
Bruce Tate 居住在德克萨斯州的奥斯汀,他是一位父亲,同时也是山地车手和皮艇手。他是 3 本 Java 畅销书籍的作者,其中包括荣获 Jolt 大奖的 Better, Faster, Lighter Java 一书。他最近又出版了 From Java to Ruby 和 Rails: Up and Running。他在 IBM 工作了 13 年,随后创建了 RapidRed 顾问公司,在那里他潜心研究基于 Ruby 和 Ruby on Rails 框架的轻量级开发策略和架构。如今,他是 WellGood LLC 公司的 CTO,该公司专为非营利组织和慈善机构谋求市场中的一席之地。 |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者