我的程序中有很多记录,我最终使用其中一个字段作为键放入地图。例如
(defrecord Foo. [id afield anotherfield])
然后我将其添加到id为关键的地图中。这一切都是完全可行的,但有点单调乏味,例如在向地图添加新的Foo实例时,我需要先提取密钥。我想知道clojure.core中的某个地方是否存在已经存在的数据结构?
基本上我想通过在集合的构造时给键值映射函数(即:id)设置一个值来构造一组Foo,然后在我想添加/查找/删除时使用它/ ...一个值。
所以而不是:
(assoc my-map (:id a-foo) a-foo))
我能做到,说:
(conj my-set a-foo)
更有趣的是,合并和合并 - 支持。
答案 0 :(得分:3)
听起来像一个简单的案例,你想要使用一个函数来消除“乏味”的部分。
e.g。
(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))
最后,请注意您可以对宏执行相同的操作。然而,宏的一个有用的一般规则是除非你真的需要它们否则不使用它们。因此,在这种情况下,由于可以通过函数轻松完成,我建议坚持使用函数。
答案 1 :(得分:1)
那么(AFAIK)没有这样的数据结构(即使有,也可能在背景中做同样繁琐的事情),你可以在你的记录fns上建立所需的操作(在后台做同样繁琐的工作)需要做的事情)。
基本上我想构建一个集合 Foo通过给出一个值来设置一个值 密钥映射函数(即:id)at 施工时间的设定,然后 在我想要的时候使用它 添加/查找/删除/...
没有得到这个..如果你在一个集合中持有你的记录然后想要例如通过id找到一个,你必须做更加整洁的工作,查看每个记录,直到你找到正确的一个..那是O(n),当使用地图时你将有O(1)。 我过分使用乏味吗?我的建议是使用地图并做一些繁琐的事情。毕竟这都是1和0:)