5

私のプログラムにはかなりの数のレコードがあり、それらのフィールドの1つをキーとして使用してマップを作成することになります。例えば

(defrecord Foo. [id afield anotherfield])

次に、IDをキーとしてマップに追加します。これはすべて完全に実行可能ですが、少し面倒です。たとえば、Fooの新しいインスタンスをマップに追加するときは、最初にキーを抽出する必要があります。clojure.coreのどこかに、これを行うためのデータ構造がすでに存在するのだろうか?

基本的には、セットの構築時にキーマッピング関数(つまり:id)に値を与えて、Fooのセットを構築し、それを追加/検索/削除/したいときに使用したいと思います。 。 価値。

したがって、代わりに:

(assoc my-map (:id a-foo) a-foo))

私は言うことができます:

(conj my-set a-foo)

そしてもっと興味深いことに、マージとマージ-サポート付き。

4

2 に答える 2

3

関数を使用して「面倒な」部分を排除したいという単純なケースのように聞こえます。

例えば

(defn my-assoc [some-map some-record]
  (assoc some-map (:id some-record) some-record))

これを頻繁に実行していて、さまざまなキー関数が必要な場合は、高階関数を試してみてください。

(defn my-assoc-builder [id-function]
  (fn [some-map some-record] 
    (assoc some-map (id-function some-record) some-record)))

(def my-assoc-by-id (my-assoc-builder :id))

最後に、マクロでも同じことができることに注意してください。ただし、マクロに関する有用な一般的な規則は、本当に必要でない限り、マクロを使用しないことです。したがって、この場合、関数を使用して簡単に実行できるため、関数に固執することをお勧めします。

于 2011-02-20T11:50:12.583 に答える
1

(AFAIK)そのようなデータ構造はありません(そして、あったとしても、おそらくバックグラウンドで同じ退屈なことをします)、あなたはあなたのレコードfnsに基づいて望ましい操作を構築することができます(バックグラウンドで必要な同じ退屈なことをします行われなければ)。

基本的には、セットの構築時にキーマッピング関数(つまり:id)に値を与えて、Fooのセットを構築し、それを追加/検索/削除/したいときに使用したいと思います。 。

これを取得できませんでした..レコードをセットで保持していて、たとえばIDでレコードを検索したい場合は、正しいレコードが見つかるまで、すべてのレコードを調べてさらに面倒な作業を行う必要があります。これはO(n )、マップを使用する場合はO(1)になります。面倒な使い方をしすぎましたか?私の提案は、マップを使用して退屈なことをすることです。結局のところ、それはすべて1と0です:)

于 2011-02-16T21:28:30.017 に答える