2016-03-21 5 views
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-protocolyからxに移動すると問題が解決されます。

答えて

1

importは、Javaクラス用のため、MyProtocol:importでインポートすることはできません。

次のコードは、あなたのレコードタイプとプロトコルで動作します。

(ns y 
    (:require [.. Myprotocol]) 
    (:import (x MyData))) 
+0

これを試しましたが、それでも私には同じエラーが表示されます。/ – Johan

+1

ああ、わかります。また、 'y-test'名前空間に名前空間' y'を 'require'する必要があります。 –

関連する問題