clojure - 有没有办法在 Clojure 中获取 watch 的所有按键

标签 clojure

如果有一个原子:

(def a (atom {}))

配备以下 watch

(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 声明方法 getWatchesARef 中实现。

解决方案如下:

(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)))

关于clojure - 有没有办法在 Clojure 中获取 watch 的所有按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12813695/

相关文章:

java - Clojure Leiningen 多个项目编译错误 - ClassNotFoundException

clojure - 为什么 pmap|reducers/map 不使用所有 cpu 核心?

csv - 将具有不同行宽的 CSV 导入 Incanter?

java - 以 Clojure 格式(java.util.Formatter)、cl 格式(Common Lisp 格式)以编程方式控制填充?

pointers - Clojure 有变量引用吗?

clojure - 映射内使用的函数的 with-redefs

Clojure 创建目录层次结构 - 但不是以程序方式

unit-testing - Midje 在 Clojure 中的宏上失败

Clojure - 将列表元素视为函数参数

clojure - 使用 clojure.data.xml 从 Clojure 发出 XML。