2
のは、私が原子を持っているとしましょう:のClojure:(アドオン時計を使用して)二つの原子間で同じキーを持つ値のチェック平等
(def pets (atom { :cats {} :dogs {} }))
私は変更のため、このアトムを見たいと思うので、私はウォッチャーを作成:
(add-watch pets :pet-watcher
(fn [r k os ns]
(when (not= os ns
(println (str "Pets updated: " ns))))))
私は原子自分のペットを更新した場合今、私は変更の通知を得る:
(swap! pets assoc-in [:dogs] {:name "Sparky" :color "Brown"})
; Pets updated: {:cats {}, :dogs {:name "Sparky", :color "Brown"}}
しかし、どのような場合、私は唯一のnになりたいです:cats
が変更された場合は、私はderef'd原子の性質を比較しようとすると、私はエラーを取得する:
; THIS DOES NOT WORK
(add-watch pets :cat-watcher
(fn [r k os ns]
(when (not= (:cats @os) (:cats @ns)
(println (str "Cats updated: " (:cats @ns)))))))
(swap! pets assoc-in [:cats] {:name "Whiskers" :color "Orange"})
; Error: No protocol method IDeref.-deref defined for type cljs.core/PersistentArrayMap
は確かに二つの原子間で同じキーで値を比較するためのエレガントな方法があるに違いありません。 :cat-watcher
を更新して、ちょうど:cats
への変更を通知しますか?
素晴らしい作品です、ありがとうございます! – piercebot