Ruby block 不是闭包

栏目: Ruby · 发布时间: 5年前

内容简介:在很多地方看到过 Ruby 的块是闭包的说法, 英文文章里也有提到"Ruby block lock is closure". 我想了很久, 找了很多资料, 还是认为这种说法不准确. 至少他们这里讲的闭包的定义和我理解的闭包的定义是不同的.首先, 我认为闭包必然包括两部分:一个 Ruby 的 block 在这里只能满足其条件

在很多地方看到过 Ruby 的块是闭包的说法, 英文文章里也有提到"Ruby block lock is closure". 我想了很久, 找了很多资料, 还是认为这种说法不准确. 至少他们这里讲的闭包的定义和我理解的闭包的定义是不同的.

首先, 我认为闭包必然包括两部分:

  1. 一个函数.
  2. 这个函数携带的外部环境(变量等).

一个 Ruby 的 block 在这里只能满足其条件 1 . 它的行为非常类似一个函数, 可以接受参数, 可以在接受 block 的那个方法里面使用 yield 关键字调用. 但是要称其为闭包, 我认为它还缺少携带的外部环境. 一个没有外部环境的函数那就仅仅是一个函数, 而不能称其为闭包.

称呼 block 为闭包的文章多在讨论 block , Proc , lambda 等概念的异同. 我承认 Ruby 的 Proc 可以定义在一个函数内部, 并且被返回回去(同时携带外部环境), 这样可以实现闭包. 而且 blockProc 又很像, 甚至可以通过 & 符号互相转换, 但是毕竟 block 不能定义在函数内部, 也不能携带外部环境. 所以不能形成闭包.

我觉得块只能被当做一个函数, 而且可以是一个 "first-class" 函数, 与函数指针等的概念是不同的. 但是它的行为被称作回调函数更为准确, 毕竟是把一个函数传递给另外一个方法, 等待在方法中被调用.


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Clojure编程

Clojure编程

Chas Emerick、Brian Carper、Christophe Grand / 徐明明、杨寿勋 / 电子工业出版社 / 2013-3-26 / 99.00元

Clojure是一种实用的通用语言,它是传奇语言LISP的方言,可与Ruby、Python等动态语言相媲美,更以无缝Java库、服务,以及拥有JVM系统得天独厚的资源优势而胜出。本书既可以用来熟悉Clojure基础知识与常见例子,也可了解其相关的实践领域与话题,更可以看到这一JVM平台上的LISP如何帮助消除不必要的复杂性,为大家在编程实践中解决最具挑战性的问题开辟新的选择——更具灵活性,更适于W......一起来看看 《Clojure编程》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换