5 Stimmen

Verwirrt über die Auflösung des Klassennamens

Zwei Dateien

types.clj:

(ns test.types)

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

core.clj (Es ist OK)

(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: Unable to resolve 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 (Es ist OK)

(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 verweist bereits auf: #'test.types/->ProductPrice im Namespace: 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)))))))

Ich bin völlig verwirrt über diese Ausnahmen. Und ich kann keine weitere Verwendung von "record" finden, außer einigen einfachen Beispielen auf clojure.org und in Büchern.

Vielen Dank für jede Hilfe!

10voto

Joost Diepenmaat Punkte 17508

Defrecord erzeugt eine Java-Klasse in dem nach dem aktuellen Namensraum benannten Paket. (ProductPrice. ...) ist ein Aufruf an den Konstruktor dieses Typs; dies ist Java-Interop - kein einfacher Funktionsaufruf.

Sie können nicht auf eine Klasse verweisen, die außerhalb von java.lang oder dem aktuellen Namespace definiert ist, es sei denn, Sie haben explizit importieren oder geben Sie den vollständigen Paketnamen an. Dazu gehört auch der Aufruf seines Konstruktors.

Um das Problem zu beheben, müssen Sie also Price und ProductPrice importieren.

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

oder rufen Sie den vollständigen Namen der Klasse und des Pakets auf:

 (test.types.Price. ...)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X