當我要去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!'是很自然的,那麼您可以考慮使用驗證函數來配置原子。 –