2011-08-23 9 views
7

defrecordは名前付きパラメータをサポートしていますか?名前付きパラメータをdefrecordでクローズしますか?

(defrecord Person [name age]) 

が、私はこのような何かを行うことができます。:私はこのような何かを持っている場合場合つまり

(Person. {:age 99 :name "bob"}) 
(Person. :age 99 :name "bob") 

私はグーグルで見る唯一のものは、このようなものです:

(Person. "bob" 99) 

どの

+3

Clojure 1.3に追加されたdefrecordは、自動的にコンストラクタを作成します。 map-> Person http://dev.clojure.org/display/design/defrecord+improvements –

答えて

0

現在のところ、

しかし、あなただけのパラメータに名前を付け忘れると、拡張マップを使用することができます:私は個人的に、これはあなたが可能なフィールドの数が多い時にレコードを使用する最も簡単な方法であることがわかり

(defrecord Person []) 

(Person. nil {:age 99 :name "bob"}) 

を。

+0

okを参照してください。しかし、マップの前には何もしていませんか? – Kevin

+0

あなたが望むならメタデータ用です...... – mikera

+0

ありがとう、これは最も合理的な回避策のように思われるので、これを正解とマークします。 – Kevin

4

が組み込まれていますが、のようなものを使用することができない:

(defmulti make-instance (fn [class & rest] class)) 
(defmacro defrecord* [record-name fields] 
    `(do 
    (defrecord ~record-name ~fields) 
    (defmethod make-instance (quote ~record-name) [_# & {:keys ~fields}] 
     (new ~record-name [email protected])))) 
(defrecord* Person [name age]) 
(make-instance 'Person :age 99 :name "bob") 

あなたが望むもののためになるという方法は適していません確認してください。

関連する問題