`
找不着北
  • 浏览: 313543 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【译】闭包是‘穷人’的对象

阅读更多
尽管很多人认为,对象是‘穷人’的闭包,但实际上,闭包是‘穷人’的对象。

       从一种角度来看,这是事实,当在一种没有闭包功能的语言里使用特殊处理的对象来达到闭包效果时,我就会想到这些。 我们可以把闭包简单的看成一种这样的资源:通过某种方式把自己的各种功能简单参数化的对象或接口。 想在Java或C++里尝试函数式编程的人都会遇到这种情况 – 这样可以实现其功能,但很别扭。 如果你确实要实现一个这样的功能(例如Scheme语言里的map somefun mylist功能),那么,语言里能够用简单的几句话定义出可执行的“对象”(闭包)的特性是十分让人省心的。

       但是从另外的一种观点来看,就像Scheme语言里的闭包能够 apply “函数方法” 一样,可以被当作一种低级底层的方法调度机制,因此,闭包可以、而且肯定能够用来实现非常有实际作用的具有多个方法的对象语义。 Oleg Kiselyov 曾发表过一个简短的文章论述这个问题: http://okmij.org/ftp/Scheme/oop-in-fp.txt 。通过这种方式,我们可以认为闭包比对象更富有能力,因为它比那些仅单纯依靠语言提供的方法调度机制语法支持更多的功能。 闭包,看上去就像是一个代码块,但可以用来实现对象,很明显可以得出,对象是穷人的闭包。

但一个Smalltalk语言开发者会说:稍等,既然你不惜麻烦的在你的语言里用闭包实现这个玩意,而这个玩意也很像对象,那为什么不再花点功夫、 用点力 去让它们成为能够拥有任意数量的方法的“真正的”对象呢? 由此可以看出闭包只是一种特殊情况下的对象。如果你的语言里只是拥有这些功能有限的闭包,而你又要强制使用其来实现一个对象系统,那很明显,闭包是穷人的 对象了。

       正因为这两种对立的关系, 我感觉闭包和对象之争真有点禅的意思。我想借取禅心,将 Norman Adams (“对象是穷人的闭包”这个论断的发明者)和 Christian Queinnec (”闭包是穷人的对象“说法的发明人) 合并成一个叫 Qc Na 的禅宗身上,编出一段故事。而将我自己以一个谦虚的学生的身份插到故事里。 这样做是因为,我在这里 http://www.ai.mit.edu/~gregs/ll1-discuss-archive-html/msg01488.html 最后一段也说过这些 …我觉得在考虑这两个显然完全对立的说法时,受到了很多的启发,就像下面说的:

 

* * *

     受人尊敬的大师 Qc Na 和他的学生 Anton 走在一起。为了能和大师发起一次讨论, Anton 说道:”大师,我听说对象是个非常奇妙的东西 – 是真的吗?“ 大师不屑的看了他的学生一眼,回答道:”蠢孩子 – 对象仅仅是穷人的闭包。“

被责骂后,Anton 辞别了大师,回到了自己的小房间里,热情的学起闭包知识。 他认真的阅读了所有的”Lambda: … 权威大全”系列文章以及相关资料,而且用Scheme编译器实现了一个小的以闭包为基础的面向对象的语言系统。 他明白了很多事情,急切的想告诉他的老师自己取得的进步。

       就在之后的一次跟大师的走路时,Anton 期望让大师对自己留下深刻印象,说到:”大师,我已经认真的学习了那个东西,现在我知道了对象真的是穷人的闭包。“ 大师用手杖打了一顿 Anton, 说道:”你什么时候明白了?闭包是穷人的对象。“

       这回,Anton 终于开窍了。

 

--外刊IT评论            

:)

8
8
分享到:
评论
1 楼 opensdp 2010-04-24  
有点复杂了,不熟悉

相关推荐

    基于闭包的JavaScript面向对象编程框架.pdf

    “基于闭包的JavaScript面向对象编程框架” 本文总结了基于闭包的JavaScript面向对象编程框架的设计和实现。通过使用闭包,实现了基于类的面向对象编程的封装、继承和多态特征。 闭包(Closure)是JavaScript中的...

    关系闭包的计算

    4. **主函数**:`main`函数中实例化了`jz`对象,并调用了各个闭包的计算方法,最后输出结果。 #### 总结 通过本次实验的学习,我们不仅了解了关系闭包的基本概念及其重要性,还掌握了如何利用Warshall算法高效地...

    python基础 函数,闭包,面向对象

    本文将深入探讨Python的基础知识,包括变量、数据类型、运算符、流程控制语句、字符串、元组、列表、字典、集合以及函数和闭包的概念。 ### 变量与数据类型 在Python中,变量是用来存储值的容器,可以随时赋值和...

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

    在计算机科学中,闭包是一种重要的概念,尤其在函数式编程和逻辑编程中。闭包在C语言中可能不如在一些动态类型的语言中那么常见,但依然可以通过巧妙的技巧实现。这里我们将详细讨论如何用C语言实现传递闭包、自反...

    JS闭包可被利用的常见场景

    闭包在这里的作用是创建一个能够访问对象实例的内部函数,这样当事件触发时,可以调用正确的对象方法。例如: ```javascript function associateObjWithEvent(obj, methodName) { // 返回的内部函数作为事件的...

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

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

    计算NFA中ε闭包

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

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

    3) 计算属性集闭包的算法,在课件里有详细说明。方法很简单,但用文字描述很抽象。。。。不解释。。。 4) 计算函数依赖的闭包。此步骤不作要求,但要会方法。个人总结:将所有属性元素组成一个集合(域)记为R;...

    内存泄露,闭包 内存泄露,闭包 内存泄露,闭包

    内存泄露和闭包是两个关键概念,它们紧密关联并可能对程序性能产生重大影响。 内存泄露是指程序在不再需要某些数据时,未能释放这些数据所占用的内存。在JavaScript中,由于其自动垃圾回收(Garbage Collection, GC...

    Java闭包 Java闭包

    JSR-335 将闭包引入了 Java 。闭包在现在的很多流行的语言中都存在,例如 C++、C# 。闭包允许我 们创建函数指针,并把它们作为参数传递。在这篇文章中,将粗略的看一遍Java8的特性,并介绍 Lambda表达式。而且将试...

    swift block(闭包) 属性反向传值和storyboard拆分(新)

    通过在子视图中定义一个闭包,并在父视图中设置这个闭包,可以在适当的时候调用闭包,将数据反向传递回父视图,这样就避免了使用代理或KVO等复杂的方法。 接下来,我们谈谈`storyboard拆分`。在大型项目中,...

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

    在计算机科学和图论中,自反闭包是与关系理论相关的概念,特别是在布尔代数和图的子结构分析中。自反闭包是指给定一个关系R,将其扩展为包含所有起点到自身的元素对,即对于每一个元素a,都有(a, a)属于自反闭包。这...

    JavaScript碎片—函数闭包(模拟面向对象)

    JavaScript函数闭包是模拟面向对象编程的一种技术,它允许函数记住并访问其词法作用域,即使在函数执行完毕后也能保持对其的访问。这种特性使得JavaScript能够在没有内置类和继承等传统面向对象特性的情况下实现类似...

    Swift之闭包ClosureDemo

    Swift中的闭包是一种强大的编程概念,它允许我们定义一段可移动和可重用的代码块,可以在函数中作为参数传递,也可以作为返回值。闭包在很多编程语言中都有类似的概念,但在Swift中,它们的设计既简洁又灵活,使得...

    最符合菜鸟的闭包

    闭包是编程语言中的一个重要概念,特别是在JavaScript等函数式编程语言中。对于初学者来说,它可能显得有些抽象,但理解闭包对于提升编程技能至关重要。闭包是一种特殊的作用域,它允许函数访问并操作其外部作用域的...

    JavaScript闭包函数

    闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在...而闭包工作机制的实现很大程度上有赖于标识符(或者说对象属性)解析过程中作用域的角色。

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

    文章还证明了以这些数学结构为对象,以它们之间的同态映射为态射,对应的格范畴和对应的闭包系统范畴是范畴等价的。 综上所述,文章中的内容涉及到抽象代数、格论、范畴论等多个数学领域的知识,对于理解有限集合上...

Global site tag (gtag.js) - Google Analytics