闭包和对象[关闭]

Posted

技术标签:

【中文标题】闭包和对象[关闭]【英文标题】:closures and objects [closed] 【发布时间】:2010-10-04 19:13:45 【问题描述】:

函数式编程 .. 就像经典 (Mark Twain's type)。 在阅读另一篇关于 SICP 的文章时,人们正在谈论 关闭对那里的思考产生了巨大的影响,我想起了这一点, 我很久以前读过的

闭包是穷人的对象 对象是穷人的封闭

(不记得确切的来源,但它是程序员罗塞塔石碑,或编程禅宗, 或编程的 tau ... google 变得如此拥挤以至于无法找到原始来源)

所以联合程序员......你怎么看...... 关闭是你一直缺少的东西..或者只是一些语法糖, 预处理器可以做什么!

【问题讨论】:

【参考方案1】:

http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg03277.html

尊贵的 Qc Na 大师与他的学生 Anton 一起散步。希望能 让主人议论起来,安东说:“主人,我听说了 物件是很好的东西——这是真的吗?” Qc Na 怜悯地看着 他的学生回答说:“愚蠢的学生——物体只是穷人的 关闭。”

安东受到了惩罚,离开了他的主人,回到了他的牢房, 打算研究闭包。他仔细阅读了整个“Lambda:The Ultimate...”系列论文及其表亲,并实现了一个小 具有基于闭包的对象系统的方案解释器。他学到了很多,而且 期待通知他的主人他的进步。

在与 Qc Na 的下一次散步中,Anton 试图通过以下方式给他的主人留下深刻印象 道:“师父,我已经认真研究了这件事,现在明白了 对象真的是穷人的闭包。” Qc Na 回应道 安东用他的棍子说:“你什么时候才能学会?闭包是穷人的事 对象。”那一刻,安东顿悟了。

-- 安东·范斯特拉顿

【讨论】:

这是引用的原始来源还是只是另一个引用? 链接的消息是这个特定公文的原始来源。它是对关于闭包/对象二元性的讨论的回应,因此这个概念的存在时间比这个特定的说法要长。点击链接了解完整详情。 什么是Qc Na / Anton 回调?我环顾四周,搜索这些术语只会找到对公案本身的引用。 @Elanor Zimmermann 哈哈,看看链接。安东是安东·范斯特拉顿。 Qc是Queinnec Christian。娜是诺曼·亚当斯。【参考方案2】:

我在 javascript 中使用闭包已经有很长时间了。有时它们会形成一个“对象”,有时它们是向回调提供实例数据的有用方式。

就我而言,它们是盒子里另一个有用的工具,但它不仅仅是糖。 Sugar 与您可以用另一种更复杂的语法合理地做的事情有关。在不直接支持闭包的语言中实现闭包将非常困难。

【讨论】:

更糟糕的是,用一种不直接支持闭包的语言来实现闭包提供的功能会有效地混淆你在任何地方使用它的意图。它们糖;但是当你制作冰糖时,你不能忽视糖的重要性...... @Shog9:我完全同意你的第一句话。我不知道我是否同意第二个,因为我觉得很难理解。 对不起,当我被限制为 300 个字符时,我最终削减了太多。冰糖就是简单的结晶糖;如果你不喜欢糖,那就没有意义了。许多高级编程结构——闭包、对象——只是与其他程序员交流的工具——糖。我们写冰糖。【参考方案3】:

闭包不仅仅是语法糖,尽管我认为它在某种程度上取决于您对“语法糖”的定义。

对我来说,Java 1.5 的 for-each 是语法糖,但是,例如,Ruby 块远不止于此。闭包提供了方便的抽象级别,这对于隐式声明意图很有用——这是朝着 DSL 语法迈出的一大步。

【讨论】:

【参考方案4】:

闭包和匿名块是非常重要的编程结构,我在 java、C++、C 和任何其他缺少它们的语言中快速找到了它们。它们对于异步和事件处理特别有用。它们还使获取函数的函数使用起来更加愉快,并提供了在不使用额外语法的情况下做更多事情的选择。 (参见:smalltalk 和 scheme)

【讨论】:

C#c 的委托和 lambdas 不能很好地涵盖它吗? 代表似乎是一个有趣的功能。我从列表中删除了 C#。 @Cherry:你为什么要从列表中删除 C#? 因为委托似乎与闭包和匿名块一样。不过我不确定,这取决于他们的行为。【参考方案5】:

闭包就像 OO 语言中的对象。但是函数式语言缺乏子类型和继承。

【讨论】:

你都认识吧?

以上是关于闭包和对象[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 闭包和 JavaScript 的区别? [关闭]

常规关闭的所有者

Rust 闭包和 Haskell lambda 有啥区别? [关闭]

Rust闭包和Haskell lambda有什么区别? [关闭]

什么时候使用闭包? [关闭]

快速关闭存储并作为变量访问