似乎两者都可以用来定义具有不同数据类型的函数以供后续实现。据我所知,主要区别在于
defmulti
适用于映射,而defprotocol
适用于记录。
还有哪些区别?使用其中一个的好处是什么?defmulti
适用于映射,而defprotocol
适用于记录。
还有哪些区别?使用其中一个的好处是什么?defmulti
更加灵活通用,而defprotocol
性能更好。defprotocol
支持按类型分发,类似于大多数主流编程语言中的多态。
defmulti
是一种更通用的机制,可以在除单个类型以外的其他东西上进行分发。这种灵活性会带来性能损失。补充一下,corvuscorax的回答很好地解决了原问题。
最初Clojure只有多方法(multimethods),并且在早期就进行了大量思考,构建一个可处理所有情况的调度抽象,不会强迫人们围绕语言提供的抽象来构造抽象。
随着Clojure的成熟,“用Clojure编写Clojure”的愿望需要至少在理论上能够产生Java所产生的任何字节码的抽象,因此需要协议(protocols),这是一种更接近于本地Java的调度抽象。
Clojure有一个强烈的“拥抱你的平台”理念,而协议非常适合这种思路。
extend-type
那样一起声明,这是正确的吗? - wrongusernamedefprotocol
时,需要一起声明函数。多方法声明是一个单独的事物,但defmethod
定义不必在一起。 - corvuscorax