Tôi có một dự án được thiết lập với leiningen được gọi là techne. Tôi tạo ra một mô-đun được gọi là chà với một loại trong nó được gọi là Scrub và một chức năng gọi là foo.Làm thế nào để bạn sử dụng một loại bên ngoài không gian tên riêng của nó trong clojure?
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))))
Khi tôi chạy thử nghiệm, tôi nhận được lỗi:
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)
Nếu tôi loại bỏ kiểm tra chà tất cả mọi thứ hoạt động tốt. Tại sao: sử dụng techne.scrub 'nhập' các định nghĩa hàm nhưng không phải định nghĩa kiểu? Làm thế nào để tôi tham khảo các định nghĩa kiểu?
Tôi luôn sử dụng hàm tạo hàm vì lý do này và để xác thực. –
Đúng, chúng tôi thấy hữu ích khi mở rộng tính năng xác thực để tự động thêm chức năng của hàm tạo với xác thực trường, hỗ trợ pprint cho biểu mẫu có thể đánh giá, v.v. –
Lưu ý rằng câu trả lời này được đặt trước Clojure 1.4. Từ 1.4, hàm tạo (-> Scrub) và map (map-> Scrub) được tạo tự động bởi defrecord. Đó là phương thức xây dựng ưa thích và chỉ yêu cầu bạn tham chiếu các hàm đó vào không gian tên của bạn - không cần phải nhập lớp. –