我有一个在命名空间x中定义的协议:
(ns x
(:require [..]))
(defrecord MyData [something something-else])
(defprotocol MyProtocol
(my-fn [data]))
现在我想在另一个命名空间中创建该协议的实现。我尝试做了这样的事情:
(ns y
(:require [..])
(:import (x MyData MyProtocol)))
(extend-protocol MyProtocol
MyData
(my-fn [data]
; Do something with the data
))
然而,当我尝试像这样执行my-fn
时(来自我的测试用例):
(ns y-test
(:require [x :refer [MyData my-fn]]
[...]))
...
(let [data (->MyData ...)]
(my-fn data))
我遇到了以下异常:
java.lang.IllegalArgumentException: No implementation of method: :my-fn of protocol: #'x/MyProtocol found for class: x.MyData
如果我将
MyProtocol
移动到命名空间y
,似乎可以工作。我错过了什么吗?更新
在ayato_p的答案后,我需要在y中使用协议(而不是导入它),但我仍然遇到相同的错误。将
extend-protocol
从y
移动到x
解决了问题。
y-test
命名空间中require
命名空间y
。 - ayato_p