7

原子があった場合:

(def a (atom {}))

以下の時計セットで

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

このような機能はありますか?

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

3 に答える 3

11

(atom {})clojure.lang.IRefインターフェースを実装するclojure.lang.Atom抽象クラス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)))
于 2012-10-10T07:24:58.370 に答える
3

Ivanの答えは、JVM上のClojureに最適です。ClojureScriptでこれを行う方法は次のとおりです。

(keys (.-watches a))

于 2015-12-22T01:18:40.657 に答える
2
(:watches (bean a))

また

(keys (:watches (bean a)))
于 2013-03-22T06:06:46.790 に答える