5

2 つのファイル

types.clj:

(ns test.types)

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

core.clj (大丈夫です)

(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: クラス名を解決できません: 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 (大丈夫です)

(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 はすでに参照しています: #'test.types/->ProductPrice の名前空間: 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)))))))

私はこれらの例外について完全に混乱しました。また、clojure.org や本からのいくつかの最も単純な例を除いて、「記録」に関するこれ以上の使用法を見つけることができません。

助けてください、どうもありがとうございました!

4

1 に答える 1

10

defrecord は、現在の名前空間にちなんで名付けられたパッケージに Java クラスを作成します。(ProductPrice. ...) は、その型のコンストラクターへの呼び出しです。これは Java 相互運用性であり、単純な関数呼び出しではありません。

明示的にインポートするか、完全なパッケージ名を指定しない限り、java.lang または現在の名前空間の外部で定義されたクラスを参照することはできません。これには、そのコンストラクターの呼び出しが含まれます。

この問題を解決するには、Price と ProductPrice をインポートする必要があります。

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

または、完全なクラス + パッケージ名を呼び出します。

 (test.types.Price. ...)
于 2012-04-04T10:12:52.327 に答える