كيف تستخدم نوعًا خارج مساحة اسمه في Clojure؟
سؤال
لدي مشروع تم إعداده مع Lininingen يسمى Techne. لقد قمت بإنشاء وحدة نمطية تسمى Scrub مع نوع فيها يسمى Scrub ودالة تسمى Foo.
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:
(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))))
عندما أقوم بإجراء الاختبار ، أحصل على الخطأ:
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)
إذا قمت بإزالة اختبار الاختبار ، فكل شيء يعمل بشكل جيد. لماذا: استخدام Techne.Scrub "استيراد" تعريفات الوظائف ولكن ليس تعريفات النوع؟ كيف يمكنني الإشارة إلى تعريفات النوع؟
المحلول
لان deftype يولد فصلًا ، ربما ستحتاج إلى استيراد فئة Java في Techne.scrub-test مع (: استيراد [Scrub Scrub]) في تعريف NS الخاص بك.
لقد كتبت في الواقع هذا الشيء نفسه فيما يتعلق بتحرير المسجل هنا:
شيء آخر يمكن أن تفعله هو تحديد وظيفة مُنشأة في فرك:
(defn new-scrub [state]
(Scrub. state))
وبعد ذلك لن تحتاج إلى استيراد فرك في اختبار الاختبار.
نصائح أخرى
أضيف الاستيراد ، ولكن الحصول على نفس المشكلة. أنا أختبر مع حزمة التوقعات 2.0.9 ، في محاولة لاستيراد عقدة deftype و inode الواجهة.
في 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) _))
في 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]))
والإخراج من 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
الاقتراح لاستخدام طريقة المصنع ، ومع ذلك ، هو عمل قابل للحياة.