2014-11-03 51 views
3

我有兩個文件knapsack.cljcore.cljdefrecord類未找到例外

knapsack.cljdefrecord Item。我想在core.clj中使用它,但它給我cider-repljava.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/itemitem以外的命名空間的時候。

回答

3

雖然從XSC答案是沒有錯的,我的選擇是使用從defrecord產生,避免了Java的構造函數和Java進口-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)]))) 
+1

'KS/- > Item.'應該是'KS/- > Item' – 2014-11-11 11:02:09

+0

Ashish - 正確的,固定的 – 2014-11-11 15:36:21

2

:import引用了一個Java類 - 併爲Clojure編譯器創建包/類名時將短劃線轉換爲下劃線。因此,這可能會實現:

(:import [discrete_optimization.knapsack Item])