深入理解Ruby中的block概念.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
深入理解Ruby中的block概念 这篇文章主要介绍了深入理解Ruby中的block概念,文中给出了Javascript代码块与Ruby代码块的对比,需要的朋友可以参考下 Ruby 里的 block一般翻译成代码块,block 刚开始看上去有点奇怪,因为很多语言里面没有这样的东西。事实上它还不错。 First-class function and Higher-order function First-class function 和 Higher-order function 是函数式编程语言里面的概念,听起来好像很高端的样子,其实很很简单的。 First-class functions 是指在某些语言里,函数是一等公民,可以把函数当做参数传递, 可以返回一个函数,可以把函数赋值个一个变量等等,反正就是正常值能做的事函数都能做。JavaScript 就是这样的。举个例子(下面的所有例子里,当我提到 JavaScript 时,示例代码都用的 CoffeeScript): ? 1 2 3 4 5 6 7 greet = (name) - return- console.logHello, #{name} greetToMike = greet(Mike) greetToMike()# = 输出 Hello, Mike a = greetToMike a()# = 输出 Hello, Mike 在上面的第四行里,greet(Mike) 返回了一个函数,所以第五行里才可以调用 greetToMike()输出Hello, Mike。第六行把一个函数赋值给了a,所以第七行就可以调用这个函数了。天火大道 http://www.pinshu.cc/7_7162/ higher-order function 一般翻译成高阶函数,是指接受函数做参数或者返回函数的函数。 举个非常常用的例子(用 JavaScript): ? 1 2 a = [a,b,c,d] a.map((x) - x +!)#= [a!, b!, c!, d!] 上面例子里 map 就接受了一个匿名函数作为参数。Atotype里的很多方法,比如reduce, filter,every, some 等等都是高阶函数,因为他们都接受函数作为参数。 高阶函数非常强大,表达力很强,可以避免大量重复代码。总的来说,它就是个好东西。 Block 的本质 先来看一组 Ruby 和 CoffeeScript 代码的对比。 ? 1 2 3 4 5 6 7 a = [a,b,c,d] a.map { |x| x +!}# = [a!, b!, c!, d!] a.reduce { |acc, x| acc + x}# = abcd a = [a,b,c,d] a.map((x) - x +!)# = [a!, b!, c!, d!] a.reduce((acc, x) - acc + x)# = abcd 这两组代码真的看起来超级像。我觉得这也暴露了 Ruby 的 block 的本质:高阶函数的函数参数的变体。 JavaScript 里面的map 函数接受一个函数作为参数,但是 Ruby 里的 map 却接受一个 block 作为参数。 其实 matz 早在一本书里《松本行弘的程序世界》里说了: 复制代码代码如下: 最终来看,块到底是什么? ... 块也可以看作只是高阶函数的一种特殊形式的语法。 ... 高阶函数和块的本质一样 ... 在 Ruby 里,函数不是一等公民,没有 first-class functions。但是在 Ruby 里怎样使用高阶函数呢?答案就是使用 block。可以直接用 block,也可以用 lambda 或者 proc 把 block 转换成 Proc 类的实例用。 我发现在 Ruby 里使用 block 时,几乎所有的情况下都可以用 JavaScript 的高阶函数替代。天火大道 http://www.pinshu.cc/7_7162/ Enumerable 模块里的所有方法都是典型的例子。事实上确实存在 JavaScript 版 的 Enumerable,比如 Prototype.js 就有个 Enumerable,用起来跟 Ruby版的几乎一样的。当然它是通过高阶函数实现的。 与高阶函数有何不同 除了语法上看上去有点不同外,有非常重要的两点。 控制流操作 在 block 里面可以用 break, next 等等这些在一般的循环里才有的控制流操作,这些 在高阶函数里是用不了的。比如你可以试试在 JavaScript 里用 forEach 而不用循环 实现个take_while 函数,真是相当别扭的。比如

文档评论(0)

qhhb493 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档