wro*_*ame 7 records protocols clojure clojure-1.3
似乎两者都可用于定义稍后可以使用不同数据类型实现的函数.AFAIK的主要区别在于defmulti可以在地图上工作并defprotocol在记录上工作.
还有什么其他差异?使用一个而不是另一个有什么好处?
cor*_*rax 13
简短版本:defmulti更灵活,更通用,同时defprotocol表现更好.
版本略长:
defprotocol 支持类型上的调度,这类似于大多数主流编程语言中的多态.
defmulti是一种更通用的机制,您可以在其中发送除了单一类型之外的其他内容.这种灵活性会带来性能损失.
只是为了掩盖动机,corvuscorax的答案很好地涵盖了原始问题.
最初的Clojure只有多方法和花了很多心思很早就进入建设调度抽象,可以处理所有的情况非常好,不会强迫人们围绕结构由语言所提供的抽象的限制他们的抽象.
随着Clojure成熟,创建"clojure in clojure"的愿望需要抽象,至少在理论上能够生成可由java生成的任何字节码,从而需要协议,一种更接近本机Java的调度抽象.
Clojure拥有强大的"拥抱您的平台"理想,协议非常适合这种心态.