`
RednaxelaFX
  • 浏览: 3049401 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

关于对象与闭包的关系的一个有趣小故事

阅读更多
在一个邮件列表里看到一段很有趣的小故事:
RE: What's so cool about Scheme?
Anton van Straaten 写道
  The venerable master Qc Na was walking with his student, Anton. Hoping to prompt the master into a discussion, Anton said "Master, I have heard that objects are a very good thing - is this true?"  Qc Na looked pityingly at his student and replied, "Foolish pupil - objects are merely a poor man's closures."

  Chastised, Anton took his leave from his master and returned to his cell, intent on studying closures. He carefully read the entire "Lambda: The Ultimate..." series of papers and its cousins, and implemented a small Scheme interpreter with a closure-based object system.  He learned much, and looked forward to informing his master of his progress.

  On his next walk with Qc Na, Anton attempted to impress his master by saying "Master, I have diligently studied the matter, and now understand that objects are truly a poor man's closures." Qc Na responded by hitting Anton with his stick, saying "When will you learn? Closures are a poor man's object." At that moment, Anton became enlightened.

哈哈,Anton用十分风趣的口吻把对象与闭包之争的“宗教性”描写了出来。无论从哪个角度出发都能说得通,所以实在没什么争执的必要……
分享到:
评论
2 楼 RednaxelaFX 2008-09-21  
我不理解你不理解的是什么……闭包的定义很好理解撒。要点有俩:
1、一个含有自由变量的函数;
2、这些自由变量所在的环境。
外部环境持有内部函数所使用的自由变量,对内部函数形成“闭包”,就这样。
简单但不严格的说,一个函数的“自由变量”就是既不是参数也不是局部变量的变量。

一个纯粹(无副作用)的函数如果不含有自由变量,那么每次用相同的参数调用后的得到的结果肯定是一样的。但如果一个函数含有自由变量,那么调用返回的结果不但依赖于参数的值,还依赖于自由变量的值。因此一个含有自由变量的函数要正确执行,必须保证其所依赖的外围环境的存在。

基于类的面向对象程序语言中有一种情况,就是方法是用的自由变量是来自其所在的类的实例的。像这样:
class Foo {
    private int x;
    int AddWith( int y ) { return x + y; }
}

这样的AddWith()有一个参数y和一个自由变量x,其返回的值既依赖于参数的值也依赖于自由变量的值。为了让AddWith()正确工作,它必须依附于Foo的一个实例,不然就得不到x的值了(称为:“变量i未与值相绑定”)。很好理解对吧。不过面向对象的语言里一般不把类称为闭包,没为什么,就是种习惯。
当然严格来说方法所捕获的自由变量不是i,而是this;x是通过this来访问到的,完整写出应该是this.x。

如果这个“外围环境”来自一个外围函数,并且内部函数可以作为返回值返回,那么外围函数的局部环境就不能在调用结束时就撤销。也就是说不能在栈上分配空间。
function AddWith(x) {
    return function(y) {
        return x + y
    }
}

这样的内部函数有一个参数y和一个自由变量x。x在外围函数AddWith()里是一个参数,也就是一个“已绑定了值的变量”(bound variable)。AddWith()的局部作用域中含有内部函数所使用的自由变量,对内部函数形成闭包。为了让返回出去的内部函数能正常工作,这个内部函数必须依附于一个能提供x的值的环境,也就是AddWith()提供的闭包。这样我们就能够:
var addFive = AddWith(5)
var seven = addFive(2) // 2+5=7


全局变量是一种特殊的自由变量。
1 楼 lwwin 2008-09-21  
closure的定义每次都被FX搞糊涂=v=+

不知道FX大自己的理解是怎样的呢~很微妙似的……

相关推荐

    关系闭包的计算

    在计算机科学与数学领域中,关系闭包是一种重要的概念,特别是在图论与数据库理论中有着广泛的应用。本实验旨在通过编程实践的方式帮助学习者深入理解关系闭包的概念,并熟练掌握Warshall算法用于计算关系的自反闭包...

    二元关系的闭包运算

    在集合A上,一个二元关系R是A的子集,其中的每一对(a, b)表示元素a与元素b之间存在某种特定的关系。例如,在整数集合上,“小于”就是一个二元关系,因为它连接了一对对的整数。 接下来,我们进入闭包运算的核心...

    离散数学-关系,集合,求自反闭包,对称闭包,传递闭包

    离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包...

    江西财经大学关系的传递闭包

    关系的传递闭包是图论和离散数学中的一个重要概念,它在计算机科学,特别是数据库理论和算法设计中有着广泛的应用。在这个实验中,我们主要关注如何使用C++语言实现关系的传递闭包。 首先,关系的传递闭包是指在一...

    极小S-负传递闭包的一个求解方法

    首先,标题中提到的“极小S-负传递闭包”的概念是模糊逻辑领域中的一个高级主题。在模糊逻辑中,模糊关系是一种涉及模糊集的二元关系,可以用来表示实体之间的模糊联系。模糊关系通常在模糊控制系统、模糊决策、模式...

    离散实验报告求有限集上给定关系的自反、对称和传递闭包

    自反闭包是指关系矩阵中的主对角线全部置为1,即每个元素在关系中都与自己相关。这种闭包可以用于判断关系是否满足自反性质。例如,在社交网络中,如果两个用户之间存在关注关系,那么在关系矩阵中,他们之间的元素...

    利用Warshall_算法求二元关系的可传递闭包

    在离散数学中,二元关系是一个重要的概念,它描述了集合中的元素之间是否存在某种特定的联系。当需要研究这些关系并探究其性质时,有时我们需要计算关系的传递闭包。传递闭包是指在保持原有关系的基础上,通过关系的...

    求闭包和最小依赖集

    在关系数据库中,闭包是指一个或多个属性的集合,它们之间存在函数依赖关系。给定一个属性集U={A,B,C,...},我们可以定义其闭包为U+,它是U的所有可能的函数依赖关系的集合。 例如,给定一个属性集U={A,B},如果...

    C语言实现三种闭包算法(传递,自反,对称闭包)

    1. **传递闭包**:在一个关系集合中,如果对于所有的元素a、b和c,只要a与b有关系且b与c有关系,那么a与c也一定有关系,这样的关系被称为传递闭包。在图论中,这相当于寻找最长路径或可达性。 2. **自反闭包**:...

    关系性质判断及闭包的求法

    本主题主要关注如何判断一个关系的性质以及如何计算其闭包。我们将深入探讨自反性、对称性和传递性的概念,并学习如何通过不同的方法求解这些性质的闭包。 首先,让我们定义什么是二元关系。在集合A上,一个二元...

    用矩阵求自反闭包自反闭包

    自反闭包是指给定一个关系R,将其扩展为包含所有起点到自身的元素对,即对于每一个元素a,都有(a, a)属于自反闭包。这个过程在矩阵表示法中尤为直观。 标题“用矩阵求自反闭包”指的是通过矩阵运算来求解关系R的自...

    计算NFA中ε闭包

    #### 一、NFA与ε闭包概念介绍 **非确定有限自动机(NFA)**是一种理论计算模型,它扩展了确定有限自动机(DFA)的概念,允许在某些情况下从一个状态出发到达多个状态。在NFA中,存在一种特殊的转移类型称为ε-转移,...

    数据库属性闭包与应用

    在关系数据库理论中,属性闭包是一个重要的概念,它对数据库逻辑结构设计产生着重要影响。在本文中,我们将结合教学过程中的体会,谈谈属性闭包在关系数据理论中的应用。 首先,让我们来定义属性闭包的概念。设关系...

    原子闭包系统, 原子闭包算子和原子全蕴含系统

    原子全蕴含系统是指在特定逻辑框架下,用以表示蕴含关系的一个系统,与原子闭包系统有所区别。 在预备知识中,文章对格论的基本概念进行了回顾,包括偏序集、格的覆盖关系、并不可约元、原子、余原子以及原子格等...

    关系概念、传递闭包概念及warshall算法c++程序

    例如,如果有一个集合{1, 2, 3},一个简单的关系可能包含{(1, 2), (2, 3)},表示1与2有关系,2与3有关系,而1与3没有关系。关系可以是自反的(每个元素与自身有关),对称的(如果a与b有关,那么b也与a有关),反对...

    Java闭包 Java闭包

    在2013年发布的 JavaSE8 中包含一个叫做 Lambda Project 的计划,在 JSR-335 草案 中有描述。 JSR-335 将闭包引入了 Java 。闭包在现在的很多流行的语言中都存在,例如 C++、C# 。闭包允许我 们创建函数指针,并把...

    数据库求属性集闭包&函数依赖闭包

    声明:以下仅个人观点,若有错误,敬请指正O(∩_∩)O~ 关键点 1) 将函数依赖用multimap,string> 存储,因为函数依赖可能...对每一个子集求其闭包,记为Ri+;然后求Ri+的所有子集记为(Ri+)j;最后做映射Rià(Ri+)j。

    Javascript 闭包完整解释

    **闭包**是一个非常重要的JavaScript概念,它指的是一个函数能够记住并访问其外部作用域中的变量的能力,即使该函数在其外部作用域之外被调用也是如此。具体来说,闭包是由函数及与其相关的引用环境组合而成的一个...

Global site tag (gtag.js) - Google Analytics