3

使用 Clojure,我们有以下内容:

(defprotocol Greeter (hello [args] "Say hello"))

(extend-protocol Greeter
   String
   (hello [this] (str "Hello " this)))

(hello "world")    ; "Hello world"

到目前为止,一切都很好。然后我们添加:

(defn hello [args] (str "Wassup " args "?"))

它将先前形式的输出更改为:

(hello "world")    ; "Wassup world?"

有没有办法让协议优先于功能?

4

2 回答 2

5

有没有办法让协议优先于方法?

你不能defndefprotocol. 这是因为defprotocol实际上为您当前命名空间中的函数生成了一个绑定。请注意按以下顺序运行代码时收到的警告:

user=> (defn hello [args] (str "Wassup " args "?"))
#'user/hello
user=> (defprotocol Greeter (hello [args] "Say hello"))
Warning: protocol #'user/Greeter is overwriting function hello
Greeter

协议文档解释说,提供默认实现的正确方法是使用Object

(defprotocol Greeter (hello [args] "Say hello"))

(extend-protocol Greeter
   Object
   (hello [this] (str "Wassup " this "?")))

(extend-protocol Greeter
   String
   (hello [this] (str "Hello " this)))

(hello "world")    ; "Hello world"

(hello 1)    ; "Wassup 1?"
于 2013-04-12T16:36:11.830 回答
2

协议方法函数,因此与任何其他 var 一样,如果您想让其中两个具有相同的名称,则必须将它们放在单独的命名空间中。

于 2013-04-12T16:33:55.527 回答