我的程序中有相当多的记录,我最终使用其中一个字段作为键放入 map 中。例如
(defrecord Foo. [id afield anotherfield])
然后我会将其添加到以 id 作为键的 map 中。这一切都是完全可行的,但有点乏味,例如当向 map 添加 Foo 的新实例时,我需要首先提取 key 。我想知道 clojure.core 中的某个地方是否已经存在执行此操作的数据结构?
基本上,我想通过在构造集合时为键映射函数(即:id)赋予集合一个值来构造一组 Foo,然后在我想要添加/查找/删除时使用它/...一个值。
所以代替:
(assoc my-map (:id a-foo) a-foo))
我可以说:
(conj my-set a-foo)
更有趣的是,合并和合并支持。
最佳答案
听起来像是一个简单的例子,您希望使用一个函数来消除“乏味”的部分。
例如
(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))
最后,请注意,您可以使用宏执行相同的操作。然而,关于宏的一个有用的一般规则是除非确实需要它们,否则不要使用它们。因此,在这种情况下,由于可以使用函数轻松完成,因此我建议坚持使用函数。
关于Clojure - 使用固定值->键函数映射或设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5016089/