我有两个文件knapsack.clj
和core.clj
。defrecord Item
中有knapsack.clj
。我想在core.clj中使用它,但是即使我在cider-repl
名称空间中使用java.lang.ClassNotFoundException: discrete-optimization.knapsack.Item
,它也会在require
的knapsack
中给我错误。
代码在这里:
;; ---- knapsack.clj ---------
(ns discrete-optimization.knapsack)
;; Item record has weight and value of the Item
(defrecord Item
[weight value])
;; ---- core.clj --------
(ns discrete-optimization.core
(:require [discrete-optimization.knapsack :as KS])
(:import [discrete-optimization.knapsack Item]))
;; doing some knapsack in here.. :)
(and
(= 5 (KS/knapsack-value 5 [(Item. 3 5)]))
(= 5 (KS/knapsack-value 5 [(Item. 3 3) (Item. 2 2)])))
我的Clojure版本是
1.5.1
解决方案:
对于便携式解决方案:
在命名空间之外引用
->KS/item
时,请使用item
。 最佳答案
尽管xsc的答案是正确的,但我更喜欢使用从defrecord生成的构造函数,并避免使用Java构造函数和Java import -isms。随着时间/平台的推移,这可能更便于携带。
;; ---- knapsack.clj ---------
(ns discrete-optimization.knapsack)
;; Item record has weight and value of the Item
(defrecord Item
[weight value])
;; The ->Item constructor is generated automatically
;; ---- core.clj --------
(ns discrete-optimization.core
(:require [discrete-optimization.knapsack :as KS]))
;; doing some knapsack in here.. :)
(and
(= 5 (KS/knapsack-value 5 [(KS/->Item 3 5)]))
(= 5 (KS/knapsack-value 5 [(KS/->Item 3 3) (KS/->Item 2 2)])))