gpt4 book ai didi

clojure - 原子和条件 map 更新

转载 作者:行者123 更新时间:2023-12-01 19:19:23 26 4
gpt4 key购买 nike

我想更新一个简单的原子,例如:{:a 1} 并返回新值,就像swap! 那样,仅当给定的键已经存在时(否则返回 nil)。

这是我想到的最简单的解决方案:

(defn cond-assoc [store k v]
(when (get @store k)
(swap! store assoc k v)))

但我不觉得它真的是原子的。在(get @store k)swap! 操作之间可能会发生很多事情。还有比这更好的解决方案吗?

最佳答案

你是对的,你的解决方案不是很原子。要进行原子交换,请创建一个仅在需要时转换映射的简单函数:

(defn assoc-if-exists [m k v]
(if (m k) (assoc m k v) m))

请注意,这与原子或原子性无关。要将其与原子一起使用,只需执行

(def store (atom {:a 1}))
(swap! store assoc-if-exists :a 4) ;; {:a 4}, value changed
(swap! store assoc-if-exists :b 4) ;; {:a 4}, nothing added

请注意,当键不存在时,这不会返回 nil。如果您想要这种行为,您可以检查返回的值是否包含该键:

(defn atomic-assoc-or-nil [a k v]
(let [r (swap! a assoc-if-exists k v)]
(when (get r k) r)))

关于clojure - 原子和条件 map 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41273018/

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