2012-11-15 2 views
8

私は基本的にいくつかのチュートリアルに従うことを徹底的に試みています。 defrecordについて質問があります。ここでオプションのキーを使ってdefrecord

は私がやろうとしていますものです:上記のコードで

(defrecord somemap [key1 key2 key3 key4]) 

(defn give-me-map [m1 m2] 
    (somemap. m1 m2)) 

私は文句を言わない彼らにするたびに値を与える必要があるように、私は、オプションとしてkey3key4を持っていると思いますsomemapオブジェクトを作成します。

同様の質問hereがありますが、ここでやろうとしているのと逆です。

defrecordを任意のフィールドで定義することは可能ですか?

+3

あなたがclojureの初心者であれば、defrecordをスキップしたいと思うかもしれませんし、今はいとこです。あなたはそれらなしでかなりの有用なコードを書くことができます。 – Cubic

答えて

8

(defrecord T [...])を使用すると、->Tmap->Tの2つのファクトリ関数が作成されます。

最初は、位置パラメータをキーとして使用します。 2番目のレコードは任意のマップをレコードに適用します。

key3key4をコンストラクタに保持し、map->somemapを使用できます。

(defrecord somemap [key1 key2 key3 key4]) 

(defn give-me-map 
    [key1 key2] 
    (map->somemap {:key1 key1 :key2 key2})) 
6

Clojureのレコードはマップインターフェイスを実装しているため、コンストラクタで指定されているフィールドを除くすべてのフィールドはオプションです。のみkey1key2はコンストラクタで必要とされますが、簡単に値をassocingによってkey3またはkey4(またはそのことについては、他のキーを)設定することができます。

だから、唯一key1key2であなたのレコードを宣言することは正しいです他の地図と同じようにレコードに表示されます。

+0

レコードの私の理解はmap->コンストラクタを使うとき、すべてのキーがオプションであるということです。 例えば参照: ' (defrecordバー[bはC]) (DEF R(MAP->バー{30 C}));; #1 my-ns.Bar {:なし、:bはゼロ、30 C} '' ' – nha

関連する問題