Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 对类名的解析感到困惑吗_Clojure - Fatal编程技术网

Clojure 对类名的解析感到困惑吗

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

两个文件

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:->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. ...)