2011-01-02 18 views
13

Clojureのレコードをインポートすることはできませんが、私は別の名前空間からアクセスしようとするとエラーが出る:は、私はこのような記録を作成している

(User. "name" "email") 

javaの.lang.IllegalArgumentException:それは私が行うときに動作し、ユーザー

:クラス名を解決できません

(oe.model.modelcore.User. "name" "email") 

:私は、Javaクラスをインポートする必要があります知っているが、私はときに、自動的にこれを行うにはClojureのためにどのような方法があります:

(use 'oe.model.modelcore :reload) 

答えて

13

技術的には、レコード定義を含むファイルがコンパイルされ、クラスが作成されるようにする必要があります(必ずしも使用する必要はありません)。次に、Javaクラスとして構築できるようにインポートする必要があります。最初のnsにコンストラクタ関数を作成した場合、

呼び出し元のnsでインポートする必要はありません。

私はここに戻ってしばらくこれを書いた:あなたの質問に

+3

に私のために働いた答えはありがたいことに、それはレコードがファーストクラスの市民になったClojureの1.3、で始まるこれ以上必要であるなかったように私はこれを受け入れ答えを変更しました。ちょうど今これを読んでいる人のためのコメントを残したいと思った。 –

+0

私の経験から、あなたはAOTをコンパイルする必要があり、両方のレコードを必要とし、インポートする必要があります。 (もちろんプリズムのスキーマライブラリを使ってレコードを検証していました) –

9

あなたはこのようなレコードをインポートする必要があります。

(ns some-ns 
    (:import [oe.model.modelcore User])) 
+0

これは2014年1月 – Zubair

8

を使用すると、副作用として生成されたクラスのコンストラクタを呼び出し、その後、レコードを作成しています。これを行うには、別の答えに記載されているようにそのクラスをインポートする必要があります。

ただし、(Clojure 1.4以降の)優先パスは、defrecordによって生成されたコンストラクタ関数を使用することです(ここでは、->Usermap->Userとなります)。これらの関数を使用すると、相互運用形式を回避し、他の関数と同様にコンストラクタ関数を参照することができます。相互運用を回避することで、これはより多くのポータブルあまりHOSTYソリューションです:あなたは、あなたの名前空間に-(ダッシュ)を持っている場合

(ns some-ns 
    (:require [oe.model.modelcore :refer (->User)])) 

(def user (->User "name" "email")) 
7

それは本当に難しいかもしれません。

As it turns out there were two errors:

– Importing defrecord from another namespace is not just :use. I had to first :require the namespace, then import the defrecord. This was a trivial problem to solve and I figured it out quickly. Only this did not work in my case

– Dashes “-” and Underscores “_” are a nuisance since we are mixing Lisp with Java. While the file system uses underscores Clojure converts things to dashes. Brilliant.

So to fix the second error I use the follow in the ns block

(ns adder.core 
    (:require building-blocks.activity) 
    (:import [building_blocks.activity Activity])) 

https://cyrax.wordpress.com/2013/07/22/clojure-importrequireuse-defrecord-from-another-namespace/

+1

+1:inのアンダースコアの問題は私にはまだ食いしばっていましたので、OPが回答を受け入れてからこれを追加してくれてありがとう。 –

+0

落として申し訳ありませんが、間違っていますので、取り返せません! – Aspasia

+0

プレス投票:) – MAGx2

関連する問題