5

我的程序中有很多记录,我最终使用其中一个字段作为键将它们放入地图中。例如

(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 回答