如果有原子:
(def a (atom {}))
设置以下手表
(add-watch a :watcher println)
(add-watch a :watcher2 println)
有这样的功能吗?
(get-watches a)
;; => [:watcher :watcher2]
答案 0 :(得分:10)
(atom {})
创建一个clojure.lang.Atom
类型的对象,它扩展了实现clojure.lang.ARef接口的抽象类clojure.lang.IRef。 IRef声明在getWatches中实现的方法ARef。
以下是解决方案:
(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)))
答案 1 :(得分:2)
(:watches (bean a))
或
(keys (:watches (bean a)))
答案 2 :(得分:2)
Ivan的回答非常适合JVM上的Clojure。以下是您在ClojureScript中的表现方式:
(keys (.-watches a))