2012-01-18 56 views
4

看起來既可以用來定義以後可以實現,用不同的數據類型的功能。 AFAIK的主要區別在於,defmulti作品在地圖上和defprotocol作品的記錄。defmulti vs defprocolocol?

其他什麼區別呢?使用其中一種的好處是什麼?

回答

10

短版:defmulti更加靈活和通用,而defprotocol執行得更好。

稍長版本:

defprotocol支持的類型,就像是多態性最主流的編程語言調度。

defmulti是一個更通用的機制,你可以在其他的東西不僅僅是一個單一類型的調度。這種靈活性帶來了性能損失。

More on protocols

More on multimethods

+0

啊哈,謝謝!它似乎也不需要像「擴展類型」所要求的那樣一起聲明函數。它是否正確? – wrongusername 2012-01-18 10:07:58

+1

您可以將協議視爲Java界面。所以使用'defprotocol'你需要一起聲明函數。多方法聲明是單一的,但'defmethod'定義不必在一起。 – corvuscorax 2012-01-18 10:23:36

+0

我明白了。非常感謝你:) – wrongusername 2012-01-18 10:32:41

5

只是一個除了覆蓋的動機,corvuscorax的回答涵蓋了原始的問題很好。

最初的Clojure只有多方法並花了很多心思很早就進入建設調度抽象,可以處理所有的情況下非常好,不會強迫人們構建各地提供的抽象的限制他們的抽象由語言。

作爲Clojure的成熟製造「Clojure中的Clojure」所需的抽象的願望,即,其中至少在能夠產生可以被Java產生的任何字節碼,因而需要協議,分派抽象理論更與本地Java密切配合。
Clojure中具有很強的「擁抱你的平臺」的理想和協議西裝這種心態非常好。

+1

我明白了。那麼在Clojure中編寫Clojure有什麼好處? – wrongusername 2012-01-19 03:17:43

+2

一個原因是能夠在更高的抽象層次上編寫Clojure。有點像在C中編寫C編譯器,而不是在彙編中。這也使得ClojureScript更容易做到,並且更容易讓Clojure的CLR端口與JVM版本保持同步。另外,它在Gödel,Escher,Bach-ish的方式中很酷且優雅:-) – corvuscorax 2012-01-19 05:21:32

相關問題