私は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))))
私は状態がスワップを包むべきだと思います。また、デバッグするときにも簡単になるでしょう。 –
@ErtuğrulÇetinそれは私の本来のコードに見られるような自然な本能でした。しかし私は、このチェックとこの特別な 'スワップ! 'の間で原子の状態が変わることを望んでいません。 – DynamiteReed
'swap! 'に渡された関数の内部で検証を行うのが自然ではないと思われる場合は、バリデータ関数を使ってアトムを設定することをお勧めします。 –