Clojure 对类名的解析感到困惑吗
两个文件 types.clj:Clojure 对类名的解析感到困惑吗,clojure,Clojure,两个文件 types.clj: (ns test.types) (defrecord Price [date price]) (defrecord ProductPrice [name prices]) core.clj(没关系) core.clj(java.lang.IllegalArgumentException:无法解析类名:ProductPrice) core.clj(没关系) core.clj(java.lang.IllegalStateException:->ProductPri
(ns test.types)
(defrecord Price [date price])
(defrecord ProductPrice [name prices])
core.clj(没关系)
core.clj(java.lang.IllegalArgumentException:无法解析类名:ProductPrice)
core.clj(没关系)
core.clj(java.lang.IllegalStateException:->ProductPrice已引用:#'test.types/->命名空间中的ProductPrice:test.core)
我完全搞不懂这些例外情况。除了clojure.org和books上的一些最简单的例子外,我找不到关于“record”的更多用法
任何帮助,非常感谢 defrecord在以当前名称空间命名的包中创建一个java类。(ProductPrice…)是对该类型构造函数的调用;这是java互操作-不是简单的函数调用 除非显式导入或指定完整的包名,否则不能引用在java.lang或当前命名空间之外定义的类。这包括调用其构造函数 所以,要解决这个问题,需要输入Price和ProductPrice
(ns test.core (:import [test.types Price]))
(Price. ...)
或者调用完整的类+包名称:
(test.types.Price. ...)
请注意,名称空间名称中的连字符/下划线混乱会导致此处的混乱。如果您在
clj test
命名空间中defrecord
某个内容,它将在clj\u test
包中创建一个类,您的:import
将需要反映this@JoostDiepenmaat谢谢!为什么->Price
无需导入即可使用?“导入”似乎对我不起作用,仍然是“java.lang.RuntimeException:java.lang.ClassNotFoundException:test.types.ProductPrice”->Price是一个额外生成的辅助函数,它是一个真正的clojure函数,因此在使用该包时导出。此外,在导入记录类型之前,需要确保已编译记录类型(use
或require
它们在其中定义的名称空间)。如果你不能做到这一点,请用示例代码创建一个新问题。@JoostDiepenmaat,你可能应该将你在评论中写的内容添加到你的答案中(,你还需要确保记录类型已编译(使用或需要它们定义的名称空间),然后才能将它们导入到你的答案中;对于一个像我这样的笨蛋来说,这是救命的!
(ns test.core
(:use [test.types])
(:use [clojure.string :only (split)]))
(defrecord tProductPrice [name prices])
(defn read-data [file]
(let [name (subs (.getName file) 0 4)]
(with-open [rdr (clojure.java.io/reader file)]
(tProductPrice. name (doall (map #(apply ->Price (split % #"\t")) (drop 2 (line-seq rdr)))))))
(ns test.core
(:use [test.types])
(:use [clojure.string :only (split)]))
(defrecord ProductPrice [name prices])
(defn read-data [file]
(let [name (subs (.getName file) 0 4)]
(with-open [rdr (clojure.java.io/reader file)]
(ProductPrice. name (doall (map #(apply ->Price (split % #"\t")) (drop 2 (line-seq rdr)))))))
(ns test.core (:import [test.types Price]))
(Price. ...)
(test.types.Price. ...)