Clojure的协议影响?

时间:2010-09-10 03:03:26

标签: objective-c clojure interface

Clojure受ObjectiveC协议的影响吗?如果不是那么它们有何不同?

2 个答案:

答案 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"