闭包的概念、形式与应用

随着硬件性能的提升以及编译技术和虚拟机技术的改进,一些曾被性能问题所限制的动态语言开始受到关注,Python、Ruby 和 Lua 等语言都开始在应用中崭露头角。动态语言因其方便快捷的开发方式成为很多人喜爱的编程语言,伴随动态语言的流行,我们经常听到一个名词——闭包,很多人会问闭包是什么?闭包是用来做什么的?本文汇集了有关闭包的概念、应用及其在一些编程语言中的表现形式,以供参考。

什么是闭包?

闭包并不是什么新奇的概念,它早在高级语言开始发展的年代就产生了。闭包(Closure)是词法闭包(Lexical Closure)的简称。对闭包的具体定义有很多种说法,这些说法大体可以分为两类:

  • 一种说法认为闭包是符合一定条件的函数,比如参考资源中这样定义闭包:闭包是在其词法上下文中引用了自由变量( 1)的函数。
  • 另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。比如参考资源中就有这样的的定义:在实现深约束( 2)时,需要创建一个能显式表示引用环境的东西,并将它与相关的子程序捆绑在一起,这样捆绑起来的整体被称为闭包。

这两种定义在某种意义上是对立的,一个认为闭包是函数,另一个认为闭包是函数和引用环境组成的整体。虽然有些咬文嚼字,但可以肯定第二种说法更确切。闭包只是在形式和表现上像函数,但实际上不是函数。函数是一些可执行的代码,这些代码在函数被定义后就确定了,不会在执行时发生变化,所以一个函数只有一个实例。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。所谓引用环境是指在程序执行中的某个点所有处于活跃状态的约束所组成的集合。其中的约束是指一个变量的名字和其所代表的对象之间的联系。那么为什么要把引用环境与函数组合起来呢?这主要是因为在支持嵌套作用域的语言中,有时不能简单直接地确定函数的引用环境。这样的语言一般具有这样的特性:

  • 函数是一阶值(First-class value),即函数可以作为另一个函数的返回值或参数,还可以作为一个变量的值。
  • 函数可以嵌套定义,即在一个函数内部可以定义另一个函数。

这些概念上的解释很难理解,显然一个实际的例子更能说明问题。Lua 语言的语法比较接近伪代码,我们来看一段 Lua 的代码:

清单 1. 闭包示例1
                
function make_counter()
 local count = 0

 function inc_count()
 count = count + 1
        return count

end return inc_countendc1 = make_counter()c2 = make_counter()print(c1())print(c2())

在这段程序中,函数 inc_count 定义在函数 make_counter 内部,并作为

 

 

本文转自IBM Developerworks中国

        请点击此处查看全文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
离散数学教程 作 者: 王礼萍,刘冬丽,李放 编 出版时间:2014 丛编项: 21世纪应用型本科计算机科学与技术专业规划教材 内容简介   《离散数学教程/21世纪应用型本科计算机科学与技术专业规划教材》根据《计算机科学与技术发展战略与专业规范(试行)》要求,按照《高等学校计算机科学与技术专业核心课程教学实施方案》中离散数学应用型教学实施方案来设计,分成10个章节,具体有集合论、关系、基本逻辑、计数、初等数论、图论、群环域及格与布布代数等内容,大约需要72-84学时。主要针对于综合性大学、工程类院校的计算机科学与技术、软件T程、信息科学、计算数学等专业的离散数学课程要求进行选材和编揲撰。《离散数学教程/21世纪应用型本科计算机科学与技术专业规划教材》可以作为普通高等学校计算机与技术专业的不同方向(如软件工程、信息科学等)、计算数学等专业的本科离散教学教材,也可以供其他专业学生和科技人员阅读参考。 目录 第1章 集合论 1.1 集合的概念 1.1.1 集合 1.1.2 集合的表示 1.1.3 集合的包含关系 1.1.4 特殊集合 1.2 集合的运算 1.2.1 交、并、补的运算 1.2.2 交、并、补运算的性质 1.2.3 其他运算及其性质 1.2.4 利用集合的编码表示运算 1.3 集合的归纳定义与归纳原理 1.3.1 集合的归纳定义 1.3.2 结构归纳原理 习题1 第2章 关系 2.1 二元关系的概念 2.1.1 笛卡儿积 2.1.2 二元关系的概念 2.1.3 二元关系的表示 2.2 二元关系的性质 2.2.1 二元关系的性质概述 2.2.2 二元关系性质的判断方法 2.3 二元关系的运算 2.3.1 交、并、补的运算 2.3.2 逆运算和复合运算 2.3.3 投影、选择、联系运算 2.3.4 闭包 2.4 等价关系 2.4.1 等价关系概述 2.4.2 模m同余关系 2.4.3 等价关系与划分 2.5 相容关系 2.5.1 相容关系概述 2.5.2 极大相容类 2.5.3 完全覆盖 2.6 序关系 2.6.1 偏序关系 2.6.2 偏序集中具有特殊位置的元素 2.6.3 其他几个序关系 2.7 函数 2.7.1 函数的概念 2.7.2 特殊的函数 2.7.3 函数的逆与复合 习题2 第3章 命题逻辑 3.1 命题 3.1.1 命题概述 3.1.2 联结词 3.1.3 命题公式 3.1.4 真值函数 3.1.5 全功能集 3.2 等值演算与范式 3.2.1 逻辑等价式与永真蕴含式 3.2.2 范式 3.3 逻辑推理 3.3.1 推理的形式结构 3.3.2 推理系统 3.3.3 证明方法 3.4 例题与分析 习题3 第4章 谓词逻辑 4.1 谓词与量词 4.1.1 个体词和谓词 4.1.2 量词 4.2 谓词逻辑公式及解释 4.3 等价值蕴含式与前束范式 …… 第5章 计数 第6章 初等数论 第7章 图论基础知识 第8章 几种典型的图和图的应用 第9章 代数系统 第10章 格与布尔代数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值