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

  • 2
  • 0
  • 约3.32千字
  • 约 4页
  • 2017-06-11 发布于北京
  • 举报
深入理解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)

1亿VIP精品文档

相关文档