尽管很多人认为,对象是‘穷人’的闭包,但实际上,闭包是‘穷人’的对象。
从一种角度来看,这是事实,当在一种没有闭包功能的语言里使用特殊处理的对象来达到闭包效果时,我就会想到这些。 我们可以把闭包简单的看成一种这样的资源:通过某种方式把自己的各种功能简单参数化的对象或接口。 想在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 终于开窍了。
来自:http://www.vaikan.com/re-whats-so-cool-about-scheme/