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

时间:2012-10-10 07:00:27

标签: clojure

如果有原子:

(def a (atom {}))

设置以下手表

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

有这样的功能吗?

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

3 个答案:

答案 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))