一連のフィールドを持つレコードを定義しました。その中には計算されるものもあれば、取り込んでいる JSON データのキーに直接マップされないものもあります。そのためのファクトリ関数を書いていますが、適切なデフォルト値/見つからない値が必要です。タックするより良い方法はあり:or [field1 "" field2 "" field3 "" field4 ""...]
ますか?マクロを書くことはできますが、必要がなければ書きたくありません。
2 に答える
0
すべてのフィールドに同じデフォルト値が本当に必要で、実際には とは異なる必要がありnil
、それらを再度書き留めたくないkeys
場合は、空のインスタンスを呼び出してレコード フィールドを取得できます。実際の値とマージされたデフォルト値でマップを作成します。
(defrecord MyFancyRecord [a b c d])
(def my-fancy-record-fields (keys (map->MyFancyRecord {})))
;=> (:a :b :c :d)
(def default-fancy-fields (zipmap my-fancy-record-fields (repeat "")))
(defn make-fancy-record [fields]
(map->MyFancyRecord (merge default-fancy-fields
fields)))
(make-fancy-record {})
;=> {:a "", :b "", :c "", :d ""}
(make-fancy-record {:a 1})
;=> {:a 1, :b "", :c "", :d ""}
レコード フィールドのリストを取得するにはgetBasis
、レコード クラスで静的メソッドを使用することもできます。
(def my-fancy-record-fields (map keyword (MyFancyRecord/getBasis)))
(getBasis
は公開記録 API の一部ではないため、将来の clojure バージョンで削除されないという保証はありません。現在、clojure とclojurescriptの両方で使用できます。その使用法は、"Clojure プログラミング by Chas Emerick、Brian Carper、 Christophe Grand」であり、レコードからキーを取得する方法についての議論の中で、このスレッドでも言及されています。したがって、それを使用するのが良い考えであるかどうかを判断するのはあなた次第です)
于 2015-07-25T23:25:48.903 に答える