Clojure受ObjectiveC协议的影响吗?如果不是那么它们有何不同?
答案 0 :(得分:3)
您可能会发现这些文章和链接很有趣:
答案 1 :(得分:2)
它们共享相同的名称并且概念是相关的 - 但是Clojure协议更通用,旨在解决“表达式问题”。这video is very interesting to watch。
目标C协议更像Java / C#接口 - 它们指定了一组具体类可以实现的方法。但是,您必须在具体类中提供这些方法,这通常意味着您在实践中控制要扩展的类的源代码。
Clojure协议允许您定义一组扩展以多态方式处理任何类的函数,即使您不这样做,也可以单独提供实现控制你正在扩展的课程。
例如,将Clojure协议扩展到java.lang.String类(您肯定无法控制!)以及特殊值nil(即空值):
;; define a protocol with one function
(defprotocol FooProtocol
(foo [this]))
;; extend the protocol to String and nil
(extend-protocol FooProtocol
java.lang.String
(foo [some-string] (str "Called foo on String: " some-string))
nil
(foo [_] "Called foo on nil value"))
(foo "hello")
=> "Called foo on String: hello"
(foo nil)
=> "Called foo on nil value"