2012-04-04 9 views
5

dos archivosconfundido acerca de la resolución de nombre de clase

types.clj:

(ns test.types) 

(defrecord Price [date price]) 
(defrecord ProductPrice [name prices]) 

core.clj (de lo bien)

(ns test.core 
    (:use [test.types]) 
    (:use [clojure.string :only (split)])) 


(defn read-data [file] 
    (let [name (subs (.getName file) 0 4)] 
    (with-open [rdr (clojure.java.io/reader file)] 
     (doall (map #(apply ->Price (split % #"\t")) (drop 2 (line-seq rdr))))))) 

core.clj (java.lang.IllegalArgumentException: No se puede para resolver classname: ProductPrice)

(ns test.core 
    (:use [test.types]) 
    (:use [clojure.string :only (split)])) 


(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)))))))) 

core.clj (de lo bien)

(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))))))) 

core.clj (java.lang.IllegalStateException: -> ProductPrice ya se refiere a: # 'test.types/-> ProductPrice de espacio de nombres: test.core)

(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))))))) 

Estoy totalmente confundido acerca de estas excepciones. Y no puedo encontrar más uso sobre 'registro' excepto algunos ejemplos simples de clojure.org y libros.

Cualquier ayuda, muchas gracias!

Respuesta

9

defrecord crea una clase java en el paquete con el nombre del espacio de nombres actual. (ProductPrice. ...) es una llamada al constructor de ese tipo; esto es interoperabilidad java, no una llamada de función simple.

No puede hacer referencia a una clase definida fuera de java.lang o el espacio de nombres actual a menos que explícitamente importe o especifique el nombre completo del paquete. Esto incluye llamar a su constructor.

Por lo tanto, para solucionar el problema, debe importar Precio y PrecioProducto.

(ns test.core (:import [test.types Price])) 
(Price. ...) 

o llamar a la clase + paquete nombre completo:

(test.types.Price. ...) 
+2

Tenga en cuenta que el guión/subrayan mangling en los nombres de espacio de nombres provoca confusión en este punto. Si '' defrecord'' algo en el espacio de nombres '' clj-test'' creará una clase en el paquete '' clj_test'' y tu '': import'' deberá reflejar esto – sw1nn

+0

@Joost Diepenmaat ¡Gracias! ¿Por qué '-> Price' se puede usar sin importar? Y 'importación' no parece funcionar para mí, aún "java.lang.RuntimeException: java.lang.ClassNotFoundException: test.types.ProductPrice" – Kane

+0

-> Price es una función auxiliar adicionalmente generada que es una función real de clojure, y así se exporta cuando 'usa' el paquete. Además, debe asegurarse de que los tipos de registro estén compilados ('use' o' require' el espacio de nombres en el que están definidos) antes de que pueda 'importarlos'. Si no puede lograr que funcione, cree una nueva pregunta con un código de ejemplo. –

Cuestiones relacionadas