【发布时间】:2014-06-08 18:47:24
【问题描述】:
我正在尝试使用此协议扩展一个简单的 java 类 toxi.color.ColorList:
(defprotocol countable
(count [this]))
(extend-protocol countable
ColorList
(count [this]
(.size this)))
当我评估这段代码时,我看到了这些警告
Warning: protocol #'dat00.protocols/countable is overwriting function count
WARNING: count already refers to: #'clojure.core/count in namespace: dat00.protocols, being replaced by: #'dat00.protocols/count
但这很好用:
(count (ColorList.))
=> 0
但是如果我在同一个文件(或命名空间)中尝试这个
(count (range 5))
=> IllegalArgumentException No implementation of method: :count of protocol: #'dat00.protocols/countable found for class: clojure.lang.LazySeq clojure.core/-cache-protocol-fn (core_deftype.clj:541)
所以我的问题是:
我是否误解了有关协议的一些细节?
谢谢!
【问题讨论】:
-
协议方法导致在当前命名空间中定义同名函数。当您从某些 Clojure 代码调用协议方法时,您实际调用的是一个生成的函数,该函数查找并分派到适当的实现。
-
在此先感谢 Alex,但是您将如何解决这种情况“当前命名空间冲突”?
-
与任何其他命名空间冲突相同,如下面的答案所述。它恰好是导致冲突的协议方法这一事实并不重要。
-
感谢@Alex 我已经在下面发布了针对这种情况的 2 个工作解决方案,具有多方法和扩展协议,都更改了函数名称
标签: clojure