2
私は名前空間xに定義され、このプロトコルがあります。Clojureの別の名前空間で定義されたプロトコルを拡張しますか?
(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
))
:私はこのような何かをやってみました
(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
に移動すると問題が解決されます。
これを試しましたが、それでも私には同じエラーが表示されます。/ – Johan
ああ、わかります。また、 'y-test'名前空間に名前空間' y'を 'require'する必要があります。 –