我的问题是,通过文档和示例providede,我无法理解:key
参数的含义或其可能的值
这是我所指的功能的官方文档页面:
http://clojuredocs.org/clojure_core/clojure.core/add-watch
add-watch clojure.core
(add-watch reference key fn)
将watch函数添加到agent / atom / var / ref引用。手表fn 必须是4个参数的fn:一个键,一个参考,它的旧状态,它 新的状态。每当引用的状态可能已被更改时,任何 注册手表将调用其功能。手表fn会 在代理的线程上,如果是代理,则在任何之前同步调用 挂起发送,如果代理或参考。请注意,原子或ref的状态可能 在fn调用之前已经再次更改,因此请使用old / new-state 比derefing参考。另请注意,可能会调用watch fns 从多个线程同时。 Var观察者仅被触发 通过root绑定更改,而不是线程本地set!s。键必须是唯一的 每个参考,可用于删除手表,删除手表, 但是被监视机制认为是不透明的。
由于
答案 0 :(得分:9)
它基本上只是一个标识符,您可以在调用代码来识别手表时使用,以防每个参考有多个手表。它应该对您的应用程序代码有重要意义,但将由Clojure传递。
例如:
user> (def a (atom 0))
#'user/a
user> (add-watch a
:count-to-3
(fn [k r old-state new-state]
(println "changed from" old-state "to" new-state)
(when (>= new-state 3)
(remove-watch a :count-to-3))))
#<Atom@3287a10: 0>
user> (dotimes [_ 5] (swap! a inc))
changed from 0 to 1
changed from 1 to 2
changed from 2 to 3
nil
user> @a
5
答案 1 :(得分:8)
答案就在那里:
每个引用的键必须是唯一的,并且可用于删除 手表有删除手表,但被认为是不透明的 手表机制。
换句话说,实际的监视机制并不关心你设置密钥的方式(只要它在给定参考文件中设置的处理程序中是唯一的),但如果你曾经这样做,你需要坚持下去想要调用remove-watch
来摆脱你的处理程序