似乎两者都可用于定义稍后可以使用不同数据类型实现的函数。 AFAIK的主要区别在于defmulti
适用于地图,而defprotocol
适用于记录。
还有什么其他差异?使用一个优于另一个有什么好处?
答案 0 :(得分:12)
简短版本:defmulti
更灵活,更通用,而defprotocol
效果更好。
版本稍长:
defprotocol
支持对类型的调度,这类似于大多数主流编程语言中的多态性。
defmulti
是一种更通用的机制,您可以在其中发送除了单一类型之外的其他内容。这种灵活性会带来性能损失。
答案 1 :(得分:5)
只是增加了动机,corvuscorax的答案很好地涵盖了原始问题。
最初Clojure只有多方法并且很早就在很多想法中构建了一个可以处理所有情况的调度抽象并且不会强迫人们构建他们围绕语言提供的抽象限制的抽象。
随着Clojure的成熟,创造“clojure in clojure”的愿望需要抽象,至少在理论上能够生成任何可由java生成的字节码,因此需要协议,一个调度更接近原生Java的抽象。
Clojure拥有强大的“拥抱您的平台”理想,协议非常适合这种心态。