有没有办法在Clojure中获取手表的所有钥匙



如果有一个原子:

(def a (atom {}))

设置了以下手表

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

有这样的功能吗?

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

(atom {})创建一个类型为clojure.lang.Atom的对象,该对象扩展了实现clojure.lang.IRef接口的抽象类clojure.lang.ARef。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)))

最新更新