Clojure - 使用固定值->键函数映射或设置?

标签 clojure clojureclr

我的程序中有相当多的记录,我最终使用其中一个字段作为键放入 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/

相关文章:

clojure - 将惰性行序列写入 ClojureClr 中的文件而不进行反射

Clojure 在 JVM 上的性能与 CLR 上的性能比较

CLR 上的 Clojure

clojure:如何将命名空间作为宏参数传递?

javascript - 如何在 Clojure 中编写一个保持状态的闭包?

java - Clojure 转换器与 Java 中流的中间操作的概念相同吗?

Clojure:在结构图中获取单个值和映射

clojure - 带有重复参数的映射 clojure

Clojure 中的排序列表

clojure - 如何在 clojure-clr 之间使用 .net 函数/类?