我有两个文件knapsack.cljcore.clj

defrecord Item中有knapsack.clj。我想在core.clj中使用它,但是即使我在cider-repl名称空间中使用java.lang.ClassNotFoundException: discrete-optimization.knapsack.Item,它也会在requireknapsack中给我错误。

代码在这里:

;; ---- 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)])))

09-19 01:40