有没有办法让手表上的所有钥匙都在clojure中

zca*_*ate 7 clojure

如果有一个原子:

(def a (atom {}))
Run Code Online (Sandbox Code Playgroud)

配有以下手表

(add-watch a :watcher println)
(add-watch a :watcher2 println)
Run Code Online (Sandbox Code Playgroud)

有这样的功能吗?

(get-watches a)
;; => [:watcher :watcher2]
Run Code Online (Sandbox Code Playgroud)

Iva*_*lik 10

(atom {})创建一个类型的对象,clojure.lang.Atom它扩展了抽象类clojure.lang.ARef,它实现了clojure.lang.IRef接口.IREF声明方法getWatches是在实施阿里夫.

这是解决方案:

(def a (atom {}))
(add-watch a :watcher println)
(println (-> a .getWatches keys))
Run Code Online (Sandbox Code Playgroud)

奇怪的是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)))
Run Code Online (Sandbox Code Playgroud)