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

tan*_*mer 5 clojure

我的问题是,使用文档和示例providede我无法理解:key参数的含义或其可能的值这是我所指的函数的官方文档页面:http:
//clojuredocs.org/clojure_core/clojure.核心/加手表

add-watch clojure.core

(add-watch reference key fn)  
Run Code Online (Sandbox Code Playgroud)

向watch/atom/var/ref引用添加监视功能.手表fn必须是4个参数的fn:一个键,一个参考,它的旧状态,它的新状态.每当参考的状态可能已被更改时,任何已注册的手表都将调用其功能.如果是代理,则在代理程序的线程上同步调用watch fn,如果是agent或ref,则在任何挂起的发送之前.请注意,在fn调用之前,atom或ref的状态可能已再次更改,因此请使用old/new-state而不是derefing引用.另请注意,可以同时从多个线程调用watch fns.Var观察者仅由根绑定更改触发,而不是线程本地集!每个参考键必须是唯一的,并且可以用于删除带有删除手表的手表,但是被手表机制认为是不透明的.

谢谢

Ale*_*lex 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
Run Code Online (Sandbox Code Playgroud)


小智 8

答案就在那里:

每个参考键必须是唯一的,并且可以用于删除带有删除手表的手表,但是被手表机制认为是不透明的.

换句话说,实际的监视机制并不关心你设置密钥的方式(只要它在给定ref上设置的处理程序中是唯一的),但如果你想打电话,你需要坚持下去remove-watch摆脱你的处理程序