含义是什么:add-watch功能中的关键参数

时间:2013-11-22 20:20:15

标签: clojure

我的问题是,通过文档和示例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。键必须是唯一的   每个参考,可用于删除手表,删除手表,   但是被监视机制认为是不透明的。

由于

2 个答案:

答案 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来摆脱你的处理程序

相关问题