Clojure:在两个原子之间用同一个键检查值的相等性(使用add watch)

Clojure:在两个原子之间用同一个键检查值的相等性(使用add watch),clojure,clojurescript,Clojure,Clojurescript,假设我有一个原子: (def pets (atom { :cats {} :dogs {} })) 我想观察这个原子的变化,所以我创建了一个观察者: (add-watch pets :pet-watcher (fn [r k os ns] (when (not= os ns (println (str "Pets updated: " ns) ))))) 现在,如果我更新我的宠物atom,我会收到更改通知: (swap! pets assoc-in [:dogs] {

假设我有一个原子:

(def pets (atom { :cats {} :dogs {} }))
我想观察这个原子的变化,所以我创建了一个观察者:

(add-watch pets :pet-watcher
  (fn [r k os ns]
    (when (not= os ns
      (println (str "Pets updated: " ns) )))))
现在,如果我更新我的宠物atom,我会收到更改通知:

(swap! pets assoc-in [:dogs] {:name "Sparky" :color "Brown"})

; Pets updated: {:cats {}, :dogs {:name "Sparky", :color "Brown"}}
但是,如果我只想在以下情况下得到通知:猫变了怎么办?当我尝试比较去噪原子的属性时,我得到一个错误:

; 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

肯定有一种优雅的方法可以在两个原子之间用同一个键比较值。您将如何更新my:cat watcher以通知我对just:cats的更改?

在您的示例中只有一个atom

您不需要在监视函数中取消对os和ns的引用,因为它获取原子的新旧值,而不是原子本身。只需删除代码中的@符号