【问题标题】:What's the meaning of :key parameter in add-watch functionadd-watch函数中的:key参数是什么意思
【发布时间】:2013-11-22 20:20:14
【问题描述】:

我的问题是,对于提供的文档和示例,我无法理解 :key 参数的含义或其可能值 这是我所指功能的官方文档页面:
http://clojuredocs.org/clojure_core/clojure.core/add-watch

add-watch clojure.core

(add-watch reference key fn)  

将监视函数添加到代理/原子/var/ref 引用。手表fn 必须是 4 个参数的 fn:键、引用、其旧状态、其 新状态。每当引用的状态可能已更改时,任何 注册的手表将调用它们的功能。手表 fn 将 在代理线程上同步调用,如果是代理,则在任何之前 如果代理或参考,待发送。请注意,原子或参考的状态可能 在 fn 调用之前再次更改,所以使用 old/new-state 而不是 而不是取消引用。另请注意,可能会调用 watch fns 同时来自多个线程。 var 观察者只被触发 通过根绑定更改,而不是线程本地集!键必须是唯一的 根据参考,可用于使用 remove-watch 删除手表, 但被手表机制认为是不透明的。

谢谢

【问题讨论】:

    标签: clojure


    【解决方案1】:

    它基本上只是一个标识符,您可以在调用代码时使用它来识别手表,以防您有多个手表。它应该对您的应用程序代码具有重要意义,但会被 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
    

    【讨论】:

    • r 在匿名函数中代表什么?
    • r 是你正在看的东西,在这种情况下是原子a。如果您取消引用它,它将与 new-state 相同。
    【解决方案2】:

    答案就在这里:

    每个引用的键必须是唯一的,并且可以用来删除 带有 remove-watch 的手表,但在其他方面被认为是不透明的 手表机制。

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

    【讨论】:

      猜你喜欢
      • 2015-09-25
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      相关资源
      最近更新 更多