对clojure协议的简单解释

时间:2010-12-22 13:48:13

标签: clojure protocols

我正在尝试了解clojure协议以及它们应该解决的问题。有没有人清楚地解释clojure协议的最新情况和原因?

2 个答案:

答案 0 :(得分:265)

答案 1 :(得分:64)

我认为将协议视为概念上类似于面向对象语言(如Java)中的“接口”是最有帮助的。协议定义了一组抽象函数,可以以给定对象的具体方式实现。

一个例子:

(defprotocol my-protocol 
  (foo [x]))

使用一个名为“foo”的函数定义一个协议,该函数作用于一个参数“x”。

然后,您可以创建实现协议的数据结构,例如

(defrecord constant-foo [value]  
  my-protocol
    (foo [x] value))

(def a (constant-foo. 7))

(foo a)
=> 7

请注意,此处实现协议的对象作为第一个参数x传递 - 有点像面向对象语言中的隐式“this”参数。

协议的一个非常强大和有用的功能是,即使对象最初不是为支持协议而设计的,也可以将它们扩展到对象。例如如果您愿意,可以将上面的协议扩展到java.lang.String类:

(extend-protocol my-protocol
  java.lang.String
    (foo [x] (.length x)))

(foo "Hello")
=> 5