8

似乎两者都可以用于定义您以后可以使用不同数据类型实现的函数。AFAIK 的主要区别在于defmulti适用于地图和defprotocol适用于记录。

还有什么区别?使用其中一个有什么好处?

4

2 回答 2

15

短版:defmulti更加灵活和通用,同时defprotocol性能更好。

稍长的版本:

defprotocol支持类型分派,类似于大多数主流编程语言中的多态性。

defmulti是一种更通用的机制,您可以在其中调度其他事物,而不仅仅是单一类型。这种灵活性伴随着性能损失。

更多关于协议

更多关于多方法

于 2012-01-18T09:56:43.760 回答
5

只是为了涵盖动机,corvuscorax 的回答很好地涵盖了原始问题。

最初 Clojure 只有方法,并且在很早的时候,很多想法都用于构建一个可以很好地处理所有情况的调度抽象,并且不会强迫人们围绕该语言提供的抽象的限制来构建他们的抽象。

随着 Clojure 的成熟,创建“clojure in clojure”的愿望需要抽象,至少在理论上能够生成任何可以由 java 生成的字节码,因此需要协议,一种更接近原生 Java 的调度抽象。
Clojure 有一个强烈的“拥抱你的平台”的理想,协议非常适合这种心态。

于 2012-01-19T02:37:19.467 回答