Pregunta Cuál es el significado de: parámetro clave en la función add-watch


Mi problema es que con el documento y los ejemplos proporcionados no puedo entender el significado de :key parámetro o sus posibles valores Esta es la página oficial del documento de la función a la que me refiero:
http://clojuredocs.org/clojure_core/clojure.core/add-watch

add-watch clojure.core

(add-watch reference key fn)  

Agrega una función de vigilancia a una referencia de agente / átomo / var / ref. El reloj fn   debe ser un fn de 4 argumentos: una clave, la referencia, su estado anterior, su   nuevo estado. Siempre que se haya cambiado el estado de la referencia, cualquier   relojes registrados tendrán sus funciones llamadas. El reloj fn lo hará   ser llamado de forma sincrónica, en el hilo del agente si un agente, antes de cualquier   envíos pendientes si agente o ref. Tenga en cuenta que el estado de un átomo o referencia puede   ha cambiado de nuevo antes de la llamada fn, por lo tanto, use old / new-state rather   que derefing la referencia. Tenga en cuenta también que pueden llamarse fns de reloj   de múltiples hilos simultáneamente. Var vigilantes solo se activan   mediante cambios de enlace de raíz, no un conjunto local de subprocesos! Las claves deben ser únicas   por referencia, y se puede usar para quitar el reloj con remove-watch,   pero son considerados opacos por el mecanismo del reloj.

Gracias


5
2017-11-22 20:20


origen


Respuestas:


Básicamente es solo un identificador que puede usar en el código de llamada para identificar el reloj, en caso de que tenga más de un reloj por referencia. Es algo que debería tener importancia para el código de su aplicación, pero Clojure lo transmitirá.

Por ejemplo:

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

9
2017-11-22 20:31



La respuesta está ahí:

Las claves deben ser únicas por referencia y se pueden usar para eliminar   El reloj con quitar reloj, pero por lo demás son considerados opacos por   el mecanismo de reloj.

En otras palabras, al mecanismo de vigilancia real no le importa a lo que configuró la clave (siempre que sea único entre los manejadores establecidos en la referencia dada), pero tendrá que aferrarse a él si alguna vez desea llamar. remove-watch deshacerse de su controlador


8
2017-11-22 20:29