2016-04-09 7 views
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への変更を通知しますか?

答えて

4

例には1つのアトムしかありません。

osとnsは、原子自体ではなく、原子の新しい値を取得するため、監視関数で参照を取り消す必要はありません。コード内の@記号を削除するだけです。

+0

素晴らしい作品です、ありがとうございます! – piercebot

関連する問題