defmulti和defprotocol有何区别?

8
似乎两者都可以用来定义具有不同数据类型的函数以供后续实现。据我所知,主要区别在于defmulti适用于映射,而defprotocol适用于记录。 还有哪些区别?使用其中一个的好处是什么?
2个回答

16
defmulti更加灵活通用,而defprotocol性能更好。
稍微详细一点: defprotocol支持按类型分发,类似于大多数主流编程语言中的多态。 defmulti是一种更通用的机制,可以在除单个类型以外的其他东西上进行分发。这种灵活性会带来性能损失。
更多关于协议的内容: 更多关于协议的内容
更多关于多方法的内容: 更多关于多方法的内容

啊哈,谢谢!似乎函数不需要像extend-type那样一起声明,这是正确的吗? - wrongusername
1
你可以将协议看作是Java接口。因此,使用defprotocol时,需要一起声明函数。多方法声明是一个单独的事物,但defmethod定义不必在一起。 - corvuscorax

5

补充一下,corvuscorax的回答很好地解决了原问题。

最初Clojure只有多方法(multimethods),并且在早期就进行了大量思考,构建一个可处理所有情况的调度抽象,不会强迫人们围绕语言提供的抽象来构造抽象。

随着Clojure的成熟,“用Clojure编写Clojure”的愿望需要至少在理论上能够产生Java所产生的任何字节码的抽象,因此需要协议(protocols),这是一种更接近于本地Java的调度抽象
Clojure有一个强烈的“拥抱你的平台”理念,而协议非常适合这种思路。


1
我明白了。那么用Clojure编写Clojure的好处是什么? - wrongusername
3
一个原因是为了能够在更高的抽象层次上编写Clojure。有点像在C语言中编写C编译器,而不是使用汇编语言。这也将使类似ClojureScript这样的东西更容易实现,并且使得Clojure的CLR移植版本与JVM版本保持同步更加容易。此外,这种方法非常酷和优雅,就像《哥德尔、埃舍尔、巴赫》一样 :-) - corvuscorax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接