Wir haben einige Probleme mit Datensätzen und Protokollen in verschiedenen Namespaces.Clojure-Protokollimplementierung für Datensatztyp in anderem Namensbereich nicht gefunden
Wir haben ein Protokoll im Namespace foo.proto.
(ns foo.proto)
(defprotocol Proto
(do-stuff [this x y]))
Ich habe einen Rekord recorda im Namensraum foo.record:
(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))))
Dies funktioniert gut, solange wir in den ers sind. Wenn wir nun auf dem Otherhand eine uberjar machen und den Code ausführen, erhalten wir:
Keine Implementierung der Methode: do-Stoff, aus dem Protokoll: # 'foo.proto/gefunden Proto für Klasse
Wenn wir auf der anderen Seite das Protokoll in der Typdeklaration implementieren wie folgt:
(defrecord RecordA [bar]
proto/Proto
(do-stuff [this x y] (* x y (:bar this))))
Wir haben nicht mehr die Fehler (die einige Zeit, um herauszufinden, nahmen). Auch wenn wir die Deklaration von Proto in die gleichen ns wie RecordA verschieben, erhalten wir auch keinen Fehler.
Meine Fragen:
Was ist der Unterschied in der Erklärung zwischen der Umsetzung und in verlängern Typ oder verlängern-Protokoll?
Warum würde es funktionieren, wenn wir die Record- und Protocol-Deklarationen in dieselben ns verschieben?
Dank
Nein, das macht keinen Unterschied. –