当我要去swap!
有条件的一个原子的值时,应该将条件包装为swap!
还是应该是函数swap!
调用的一部分?我应该在我的交换内部还是外部运行支票!功能?
(import '(java.time Instant))
(def not-nil? (comp not nil?))
(defonce users (atom {
"example user 1" {:ts (Instant/now)}
"example user 2" {:ts (Instant/now)}
}))
(defn update-ts [id]
(if (not-nil? (get @users id))
(swap! users assoc-in [id :ts] (Instant/now))))
在上面的例子,我做的做swap!
之前用户的存在性检查。但是,在检查之后但在swap!
之前,用户是否可以从users
中删除?那么,将检查放在由swap!
运行的函数内更安全吗?
(defn update-ts [id]
(swap! users (fn [users]
(if (not-nil? (get users id))
(assoc-in users [id :ts] (Instant/now))
users))))
我认为这个条件应该包含swap!,调试的时候也很容易。 –
@ErtuğrulÇetin这是我在我的原始代码中看到的自然本能。但我不希望原子的状态在检查和这个特定的'swap!'之间改变。 – DynamiteReed
如果您不认为将函数中的验证传递给'swap!'是很自然的,那么您可以考虑使用验证函数来配置原子。 –