我正在尝试了解clojure协议以及它们应该解决的问题。有没有人清楚地解释clojure协议的最新情况和原因?
答案 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