Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the meaning of :key parameter in add-watch function

Tags:

clojure

My problem is that with the doc and examples providede i can't understand the meaning of :key parameter or its possible values This is the official doc page of the function that I'm referring:
http://clojuredocs.org/clojure_core/clojure.core/add-watch

add-watch clojure.core

(add-watch reference key fn)  

Adds a watch function to an agent/atom/var/ref reference. The watch fn must be a fn of 4 args: a key, the reference, its old-state, its new-state. Whenever the reference's state might have been changed, any registered watches will have their functions called. The watch fn will be called synchronously, on the agent's thread if an agent, before any pending sends if agent or ref. Note that an atom's or ref's state may have changed again prior to the fn call, so use old/new-state rather than derefing the reference. Note also that watch fns may be called from multiple threads simultaneously. Var watchers are triggered only by root binding changes, not thread-local set!s. Keys must be unique per reference, and can be used to remove the watch with remove-watch, but are otherwise considered opaque by the watch mechanism.

Thanks

like image 741
tangrammer Avatar asked Nov 22 '13 20:11

tangrammer


People also ask

What is key in stateless widget?

Key is object that is used to identify a widget uniquely. They are used to access or restore state In a StatefulWidget (Mostly we don't need them at all if our widget tree is all Stateless Widgets).

What is the key for in flutter?

There are two types of keys in Flutter: GlobalKey s and LocalKey s. The different types of LocalKey s are: ValueKey: A key that uses a simple value such as a String. ObjectKey: A key that uses a more complex data format rather than a primitive data type like a String. UniqueKey: A key that is unique only to itself.

What is a key in Dart?

A Key is an identifier for Widgets, Elements and SemanticsNodes. A new widget will only be used to update an existing element if its key is the same as the key of the current widget associated with the element.

What is key in flutter constructor?

The key identifies a widget, and this tells flutter whether a widget should be inflated new, or whether it should replace an existing widget in the tree during a build. Keys must be unique amongst the Elements with the same parent.


2 Answers

It's basically just an identifier that you can use in calling code to identify the watch, in case you have more than one watches per reference. It's something that should have significance to your application code, but will be passed through by Clojure.

For instance:

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
like image 184
Alex Avatar answered Oct 05 '22 23:10

Alex


The answer's right there:

Keys must be unique per reference, and can be used to remove the watch with remove-watch, but are otherwise considered opaque by the watch mechanism.

In other words, the actual watch mechanism doesn't care what you set the key to (as long as it's unique among the handlers set on the given ref), but you'll need to hang on to it if you ever want to call remove-watch to get rid of your handler

like image 37
jgriego Avatar answered Oct 05 '22 23:10

jgriego