快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
用域,我可以用另一个例子来很好地说明它。给定一组价格,我想要生成 一个含有价格和它相应的税金的销售-税金表。我不想将税率硬编码到闭包里。我宁愿在别处设置税率。 清单 5 是可能的一个实现:

清单 5. 使用闭包构建税金表

tax = 0.08 prices = [4.45, 6.34, 3.78] tax_table = prices.collect {|price| {:price => price, :tax => price * tax}} tax_table.collect {|item| puts "Price: #{item[:price]}  Tax: #{item[:tax]}"} Results: Price: 4.45  Tax: 0.356 Price: 6.34  Tax: 0.5072 Price: 3.78  Tax: 0.3024

在讨论作用域前,我要介绍两个 Ruby 术语。首先,symbol 是前置有冒号的一个标识符。可抽象地把 symbol 视为名称。:price 和 :tax 就是两个 symbol。其次,可以轻易地替换字符串中的变量值。第 6 行代码的 puts "Price: #{item[:price]} Tax: #{item[:tax]}" 就利用了这项技术。现在,回到作用域 这个问题。

请看清单 5 中第 1 行和第 4 行代码。第 1 行代码为 tax 变量赋了一个值。第 4 行代码使用该变 量来计算价格表的税金一栏。但此项用法是在一个闭包里进行的,所以这段代码实际上是在 collect 方 法的上下文中执行的!现在您已经洞悉了闭包 这个术语。定义代码块的环境的名称空间和使用它的函数 之间的作用域本质上是一个作用域:该作用域是闭合的。这是个基本特征。这个闭合的作用域是将闭包同 调用函数和定义它的代码联系起来的纽带。

用闭包进行定制

您已经知道如何使用现成的闭包。Ruby 让您也可以编写使用自己的闭包的方法。这种自由的形式意味 着 Ruby API 的代码会更加紧凑,因为 Ruby 不需要在代码中定义每个使用模型。您可以根据需要通过闭 包构建自己的抽象概念。例如,Ruby 的迭代器数量有限,但该语言没有迭代器也运行得很好,这是因为 可以通过闭包在代码中构建您自己的迭代概念。

要构建一个使用闭包的函数,只需要使用 yield 关键字来调用该闭包。清单 6 是一个例子。 paragraph 函数提供第一句和最后一句输出。用户可以用闭包提供额外的输出。

清单 6. 构建带有闭包的方法

def paragraph   puts "A good paragraph should have a topic sentence."   yield   puts "This generic paragraph has a topic, body, and conclusion." end paragraph {puts "This is the body of the paragraph."} Results: A good paragraph should have a topic sentence. This is the body of the paragraph. This generic paragraph has a topic, body, and conclusion.

优点

通过将参数列表附加给 yield,很容易利用定制闭包中的参数,如清单 7 中所示。

清单 7. 附加参数列表

def paragraph   topic = "A good paragraph should have a topic sentence, a body, and a conclusion. "   conclusion = "This generic paragraph has all three parts."   puts topic   yield(topic, conclusion)   puts conclusion end t = "" c = "" paragraph do |topic, conclusion|   puts "This is the body of the paragraph. "   t = topic   c = conclusion end puts "The topic sentence was: ''#{t}''" puts "The conclusion was: ''#{c}''"

跨越边界: 闭包(3)

时间:2011-07-25 IBM Bruce Tate

不过,请认真操作以保证得到正确的作用域。在闭包里声明的参数的作用域是局部的。例如,清单 7 中的代码可以运行,但清单 8 中的则不行,原因是 topic 和 conclusion 变量都是局部变量:

清单 8. 错误的作用域

def paragraph   topic = &quo

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