gpt4 book ai didi

clojure - 如何在 Clojure 中更新原子的向量元素?

转载 作者:行者123 更新时间:2023-12-02 14:40:51 28 4
gpt4 key购买 nike

我有一个向量原子,我想更新一个本身就是映射的条目。

(def vector-atom (atom []))
(swap! vector-atom conj { :id 1 :name "myname" })

我该如何仅更新该成员?

在可变的 Java 领域的思维方式中,我会做这样的事情:

(defn find-by-id [id]
(first (filter (fn [entry] (= (:id entry) id))
@vector-atom)))

(defn update-entry [id new-entry]
(let [curr-entry (find-by-id id)
merged-entry (merge curr-entry new-entry)]
###set the curr-entry to merged-entry###))

最佳答案

如果向量的索引对应于 :id,您可以使用类似的内容

(swap! vector-atom update-in [id] merge new-entry)

如果他们不这样做,那么你有两个选择:(1)使用 id -> map 的映射而不是向量和上面的简单解决方案,(2)使用向量和类似下面的东西:

(swap! vector-atom
(fn [v]
(let [i (find-index-of-entry v)]
(assoc v i (merge (nth v i) new-entry)))))

find-index-of-entry 可以是向量的简单线性扫描,或者,如果项目按 :id 排序,则可以是二分搜索。对于较长的向量来说,线性扫描当然效率极低(因此,如果向量可能较长,则按照上述(1)切换到 map 是一个值得考虑的解决方案)。

关于clojure - 如何在 Clojure 中更新原子的向量元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21772671/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com