13

私はテクネと呼ばれるライニンゲンでセットアップされたプロジェクトを持っています。Scrub と呼ばれる型と foo と呼ばれる関数を含む、scrub と呼ばれるモジュールを作成しました。

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)

test-scrub を削除すると、すべて正常に動作します。:use techne.scrub が関数定義を「インポート」するのに型定義をインポートしないのはなぜですか? 型定義を参照するにはどうすればよいですか?

4

2 に答える 2

16

deftypeはクラスを生成するため、おそらく ns 定義で (:import [techne.scrub Scrub]) を使用して、その Java クラスを techne.scrub-test にインポートする必要があります。

私は実際にここで defrecord に関してこれと同じことを書きました:

他にできることは、scrub でコンストラクター関数を定義することです。

(defn new-scrub [state] 
  (Scrub. state))

そして、test-scrub で Scrub をインポートする必要はありません。

于 2010-09-11T12:42:35.150 に答える