7

如果有一个原子:

(def a (atom {}))

搭配以下手表套装

(add-watch a :watcher println)
(add-watch a :watcher2 println)

有这样的功能吗?

(get-watches a)
;; => [:watcher :watcher2]
4

3 回答 3

11

(atom {})创建一个clojure.lang.Atom扩展抽象类clojure.lang.ARef的类型的对象,该类实现clojure.lang.IRef接口。IRef 声明了在ARef中实现的方法getWatches

这是解决方案:

(def a (atom {}))
(add-watch a :watcher println)
(println (-> a .getWatches keys))

奇怪的是clojure.core没有get-watches。我们得到的镜像add-watch实现:

(defn get-watches 
  "Returns list of keys corresponding to watchers of the reference."
  [^clojure.lang.IRef reference] 
  (keys (.getWatches reference)))
于 2012-10-10T07:24:58.370 回答
3

Ivan 的回答非常适合 JVM 上的 Clojure。以下是在 ClojureScript 中的操作方式:

(keys (.-watches a))

于 2015-12-22T01:18:40.657 回答
2
(:watches (bean a))

或者

(keys (:watches (bean a)))
于 2013-03-22T06:06:46.790 回答