Comment utilisez-vous un type en dehors de son propre espace de noms dans Clojure?
Question
J'ai un projet mis en place avec technè appelé Leiningen. J'ai créé un module appelé gommage avec un type en elle appelé Scrub et une fonction appelée foo.
technè / scrub.clj:
(ns techne.scrub)
(deftype Scrub [state]
Object
(toString [this]
(str "SCRUB: " state)))
(defn foo
[item]
(Scrub. "foo")
"bar")
technè / scrub_test.clj:
(ns techne.scrub-test
(:use [techne.scrub] :reload-all)
(:use [clojure.test]))
(deftest test-foo
(is (= "bar" (foo "foo"))))
(deftest test-scrub
(is (= (Scrub. :a) (Scrub. :a))))
Quand je lance le test, je reçois l'erreur:
Exception in thread "main" java.lang.IllegalArgumentException: Unable to resolve classname: Scrub (scrub_test.clj:11)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5376)
at clojure.lang.Compiler.analyze(Compiler.java:5190)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:5357)
Si tout test de gommage I remove fonctionne très bien. Pourquoi: l'utilisation techne.scrub « importation » les définitions de fonction, mais pas les définitions de type? Comment puis-je faire référence aux définitions de type?
La solution
Parce que DEFTYPE génère une classe, vous aurez probablement besoin d'importer cette classe Java dans techne.scrub-test avec (: import [techne.scrub Scrub]) dans votre définition ns.
En fait, j'écrit cette même chose en ce qui concerne defrecord ici:
Une autre chose que vous pourriez faire serait de définir une fonction constructeur dans les broussailles:
(defn new-scrub [state]
(Scrub. state))
et alors vous ne devez importer Scrub dans le test-gommage.
Autres conseils
J'ajoute l'importation, mais obtenir le même problème. Je teste avec les attentes empaqueter 2.0.9, en essayant de DEFTYPE d'importation INode nœud et de l'interface.
En core.clj:
(ns linked-list.core)
(definterface INode
(getCar [])
(getCdr [])
(setCar [x])
(setCdr [x]))
(deftype Node [^:volatile-mutable car ^:volatile-mutable cdr]
INode
(getCar[_] car)
(getCdr[_] cdr)
(setCar[_ x] (set! car x) _)
(setCdr[_ x] (set! cdr x) _))
En core_test.clj:
(ns linked-list.core-test
(:require [expectations :refer :all]
[linked-list.core :refer :all])
(:import [linked-list.core INode]
[linked-list.core Node]))
et la sortie de lein autoexpect:
*************** Running tests ***************
Error refreshing environment: java.lang.ClassNotFoundException: linked-list.core.INode, compiling:(linked_list/core_test.clj:1:1)
Tests completed at 07:29:36.252
La suggestion d'utiliser une méthode de fabrication, cependant, est un travail autour viable.