如何在 clojure 中使用其自己的命名空间之外的类型?
我与 leiningen 建立了一个名为 techne 的项目。我创建了一个名为 scrap 的模块,其中包含一个名为 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)
如果我删除 test-scrub 一切正常。为什么 :use techne.scrub “导入”函数定义而不是类型定义?如何引用类型定义?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
因为 deftype 会生成一个类,因此您可能需要使用 (:import 在 techne.scrub-test 中导入该 Java 类[techne.scrub Scrub]) 在你的 ns 定义中。
我实际上在这里写了关于 defrecord 的同样的事情:
你可以做的另一件事是在scrub:中定义一个构造函数
,然后就不需要在test-scrub中导入Scrub了。
Because deftype generates a class, you will probably need to import that Java class in techne.scrub-test with (:import [techne.scrub Scrub]) in your ns definition.
I actually wrote up this same thing with respect to defrecord here:
Another thing you could do would be to define a constructor function in scrub:
and then you would not need to import Scrub in test-scrub.
我添加了导入,但遇到了同样的问题。我正在使用 Expectations 包 2.0.9 进行测试,尝试导入 deftype Node 和接口 INode。
在 core.clj 中:
在 core_test.clj 中:
以及 lein autoexpect 的输出:
然而,使用工厂方法的建议是一个可行的解决方法。
I add the import, but get the same problem. I'm testing with the Expectations package 2.0.9, trying to import deftype Node and interface INode.
In core.clj:
In core_test.clj:
and the output from lein autoexpect:
The suggestion to use a factory method, however, is a viable work-around.