gpt4 book ai didi

clojure - 在 Clojure 中使用多方法而不是 cond 有什么好处?

转载 作者:行者123 更新时间:2023-12-03 17:06:12 25 4
gpt4 key购买 nike

为什么 Clojure 中的多方法不能简单地用 cond 表达式代替?

在看了 Ch. 中多方法的简单示例后,我受到启发提出这个问题。 Russ Olsen 的《Getting Clojure》一书中的 5。

用户 Daniel Compton 在回复类似问题 (Performance of multimethod vs cond in Clojure) 时说

Multimethods allow for open extension; others can extend your multimethod dispatching on arbitrary expressions. Cond expressions are closed to extension by others or even your own code.



但在这种情况下,我完全不清楚“开放扩展”和“封闭扩展”是什么意思,因为在我看来,多方法和条件表达式都可以很容易地编辑或扩展。

那么......为什么 Clojure 中的多方法不能简单地被 cond 表达式替换?

或者,等价地,如何或何时使用多方法比使用 cond 更好或更优雅?

最佳答案

这里的重点是“允许开放扩展”。任何人都可以添加新的
多方法的分支 - 一个 cond是硬编码的:新的调度
必须添加到 cond代码到位。

假设:您有一些小部件,并且想要绘制它们。小部件有
一个 :type并且您想发送如何 draw在那种类型上。

大写cond对于所有小部件你知道将工作。但现在
对于每个新的小部件,您必须触摸您的 cond源代码并修改它。
这对于例如一个实际的应用程序,不需要
延期。

对多方法做同样的事情,任何人可以实现 draw他们的
小部件。所以编写代码时并不知道所有这些。这使得
它是一种更好(甚至是强制性)的方法,例如图书馆。

现在想象一下,您已决定使用 cond在图书馆的方法
你在写。现在任何拥有新小部件的人都必须自己编写draw ,先派人参加他们的抽奖事件,然后调用您的draw .他们也
必须确保他们的 draw到处都被调用,你的draw被要求让它工作(这通常是不可能的
一种干净的方式)。

直接在 Clojure 核心中使用多方法的一个流行示例是
print-method .
这样任何人都可以为他们的类型和游戏实现“序列化”
很好。

其他值得关注的例子是
clojure.test
integrant .

关于clojure - 在 Clojure 中使用多方法而不是 cond 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62057461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com