我的问题是,使用提供的文档和示例,我无法理解:key
参数的含义或其可能的值这是我所指函数的官方文档页面:
http://clojuredocs.org/clojure_core/clojure.core/add-watch
添加watchclojure.core
(add-watch reference key fn)
将监视函数添加到代理/atom/var/ref引用中。手表fn必须是4个参数的fn:键、引用、旧状态、新状态。每当引用的状态可能发生更改时注册手表的功能将被调用。手表fn将如果是代理,则在代理的线程上同步调用挂起发送if agent或ref。注意原子或ref的状态可能在fn调用之前再次更改,因此请使用旧/新状态而不是取消引用。还要注意的是,可以调用watch-fns同时从多个线程。Var观察者仅被触发通过根绑定更改,而不是线程本地设置!s.密钥必须是唯一的每个参考并且可以用于移除带有移除手表的手表,但是在其它方面被钟表机构认为是不透明的。
感谢
它基本上只是一个标识符,您可以在调用代码时使用它来识别手表,以防每个引用有多个手表。它应该对您的应用程序代码具有重要意义,但将由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
答案就在那里:
每个引用的密钥必须是唯一的,并且可以用于删除带有remove手表的手表,但在其他方面被视为不透明手表机构。
换句话说,实际的监视机制并不关心您将密钥设置为什么(只要它在给定ref上设置的处理程序中是唯一的),但如果您想调用remove-watch
来摆脱处理程序