Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
似乎两者都可以用于定义您以后可以使用不同数据类型实现的函数。AFAIK 的主要区别在于defmulti适用于地图和defprotocol适用于记录。
defmulti
defprotocol
还有什么区别?使用其中一个有什么好处?
短版:defmulti更加灵活和通用,同时defprotocol性能更好。
稍长的版本:
defprotocol支持类型分派,类似于大多数主流编程语言中的多态性。
defmulti是一种更通用的机制,您可以在其中调度其他事物,而不仅仅是单一类型。这种灵活性伴随着性能损失。
更多关于协议
更多关于多方法
只是为了涵盖动机,corvuscorax 的回答很好地涵盖了原始问题。
最初 Clojure 只有多方法,并且在很早的时候,很多想法都用于构建一个可以很好地处理所有情况的调度抽象,并且不会强迫人们围绕该语言提供的抽象的限制来构建他们的抽象。
随着 Clojure 的成熟,创建“clojure in clojure”的愿望需要抽象,至少在理论上能够生成任何可以由 java 生成的字节码,因此需要协议,一种更接近原生 Java 的调度抽象。 Clojure 有一个强烈的“拥抱你的平台”的理想,协议非常适合这种心态。