如果有一个原子:
(def a (atom {}))
搭配以下手表套装
(add-watch a :watcher println)
(add-watch a :watcher2 println)
有这样的功能吗?
(get-watches a)
;; => [:watcher :watcher2]
如果有一个原子:
(def a (atom {}))
搭配以下手表套装
(add-watch a :watcher println)
(add-watch a :watcher2 println)
有这样的功能吗?
(get-watches a)
;; => [:watcher :watcher2]
(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)))
Ivan 的回答非常适合 JVM 上的 Clojure。以下是在 ClojureScript 中的操作方式:
(keys (.-watches a))
(:watches (bean a))
或者
(keys (:watches (bean a)))