快速业务通道

跨越边界: 闭包 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
t;A good paragraph should have a topic sentence."   conclusion = "This generic paragraph has a topic, body, and conclusion."   puts topic   yield(topic, conclusion)   puts conclusion end my_topic = "" my_conclusion = "" paragraph do |topic, conclusion|   # these are local in scope   puts "This is the body of the paragraph. "   my_typic = topic   my_conclusion = conclusion end puts "The topic sentence was: ''#{t}''" puts "The conclusion was: ''#{c}''"

闭包的应用

下面是一些常用的闭包应用:

重构

定制

遍历集合

管理资源

实施策略

当您可以用一种简单便利的方式构建自己的闭包时,您就找到了能带来更多新可能性的技术。重构能 将可以运行的代码变成运行得更好的代码。大多数 Java 程序员都会从里到外 进行重构。他们常在方法 或循环的上下文中寻找重复。有了闭包,您也可以从外到里 进行重构。

用闭包进行定制会有一些惊人之处。清单 9 是 Ruby on Rails 中的一个简短例子,清单中的闭包用 于为一个 HTTP 请求编写响应代码。Rails 把一个传入请求传递给控制器,该控制器生成客户机想要的数 据(从技术角度讲,控制器基于客户机在 HTTP accept 头上设置的内容来呈现结果)。如果您使用闭包 的话,这个概念很好理解。

清单 9. 用闭包来呈现 HTTP 结果

@person = Person.find(id) respond_to do |wants|   wants.html { render :action => @show }   wants.xml { render :xml => @person.to_xml } end

清单 9 中的代码很容易理解,您一眼就能看出这段代码是用来做什么的。如果发出请求的代码块是在 请求 HTML,这段代码会执行第一个闭包;如果发出请求的代码块在请求 XML,这段代码会执行第二个闭 包。您也能很容易地想象出实现的结果。wants 是一个 HTTP 请求包装程序。该代码有两个方法,即 xml 和 html,每个都使用闭包。每个方法可以基于 accept 头的内容选择性地调用其闭包,如清单 10 所示 :

清单 10. 请求的实现

def xml    yield if self.accept_header == "text/xml"   end   def html    yield if self.accept_header == "text/html"   end

跨越边界: 闭包(4)

时间:2011-07-25 IBM Bruce Tate

到目前为止,迭代是闭包在 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)}

闭包还有一项重大的优势:让实施策略变得容

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号