Techne adlı leiningen ile kurulmuş bir projem var. Scrub olarak adlandırılan bir tiple bodur ve foo adında bir işlev oluşturdum.Clojure'da kendi ad alanının dışında bir türü nasıl kullanıyorsunuz?
techne/scrub.clj:
(ns techne.scrub)
(deftype Scrub [state]
Object
(toString [this]
(str "SCRUB: " state)))
(defn foo
[item]
(Scrub. "foo")
"bar")
techne/scrub_test.clj:
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)
Ben ise: Testi çalıştırdığınızda
(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))))
, hatası alıyorum test ovma çıkarın her şey iyi çalışıyor. Neden: techne.scrub 'import' işlev tanımlarını kullanın ama tip tanımlarını değil? Tür tanımlarına nasıl başvururum?
Bu nedenle her zaman yapıcı işlevlerini ve doğrulama için kullanırım. –
Yep, alan onaylama, pprint desteği ile değerlendirilebilen bir forma vb. Gibi kurucu işlevlerini otomatik olarak eklemek için defrecord'ı genişletmenin faydalı olduğunu bulduk. –
Bu yanıtın Clojure 1.4 öncesi olduğunu unutmayın. 1.4'den beri, konumsal (-> Fırçalama) ve harita (map-> Scrub) kurucusu otomatik olarak defrecord ile oluşturulacaktır. Bu tercih edilen yapım yöntemidir ve sadece bu işlevleri ad alanınıza yönlendirmeniz gerekir - sınıfı içe aktarmaya gerek yoktur. –