異なる名前空間のレコードとプロトコルにはいくつかの問題があります。Clojureプロトコル実装が他のネームスペースのレコードタイプに見つかりません
名前空間foo.protoにはプロトコルがあります。これは罰金限り、私たちはREPLであるとして働く
(ns foo.record
(:require [foo.proto :as proto]))
(defrecord RecordA [bar])
;; RecordA implements the protocol:
(extend-type RecordA
proto/Proto
(do-stuff [this x y] (* x y (:bar this))))
:
(ns foo.proto)
(defprotocol Proto
(do-stuff [this x y]))
私は名前空間foo.recordのレコードRECORDAを持っています。 otherhandに我々はuberjarを作成し、コードを実行すると今、私たちが得る:
方法のない実装:プロトコルの行い-もの:# 'foo.proto我々がいる場合/プロトクラス
見つかり一方、そのように型宣言でプロトコルを実装:
(defrecord RecordA [bar]
proto/Proto
(do-stuff [this x y] (* x y (:bar this))))
私たちは、もはや(把握するためにいくつかの時間がかかった)エラーを取得していないし。 また、Protoの宣言をRecordAと同じnsに移動すると、エラーは発生しません。
私の質問は:
宣言でと型を拡張または拡張プロトコルを実装するに違いは何ですか?
レコードとプロトコルの宣言を同じnsに移動すると、なぜ機能しますか?あなたの
foo.record
名前空間宣言にプロトコル(:import (foo.proto Proto))
をインポートする必要が
おかげ
いいえ、違いはありません。 –