将版本号添加到Clojure ref

时间:2011-04-08 08:25:28

标签: clojure

我想知道每次更改ref时是否有必要添加时间戳元数据的版本号,以便数据的新鲜度可用于确定GUI组件是否更新数据。

4 个答案:

答案 0 :(得分:3)

如果向ref添加元数据(或纯数据),则UI组件必须轮询ref以了解是否更新。您可能最好在ref更新中使用代理发送来通知感兴趣的各方。

答案 1 :(得分:2)

虽然元数据是一个选项,但您可以将您的参考数据放在地图中。无论哪种方式,您都必须进行地图查找,因为Clojure的元数据存在于地图中。使用元数据只会让您跳过额外的障碍。因此,当您定义/更新您的ref时,只需将其设为地图,您将在功能上等效,而无需使用meta来获取信息。

答案 2 :(得分:2)

您也可以将your question from yesterday的答案用于此目的。

(def my-ref (ref {}))
(def my-ref-version (atom 0))
(add-watch my-ref (fn [key ref old new] (swap! my-ref-version inc))) 

如果您坚持使用不可变数据结构,那么您可以保存上次提供的数据副本,并将其与您正在考虑提供的数据进行比较。这将更加简单,您不会重新发送已更新为相同值的数据。 不可变数据非常适合缓存使用时间戳,当您无法直接将数据与上次发送的数据进行比较时,这很好。对于不为集合提供高效复制功能的语言,这是必要的,因为在发送数据之前无法有效地保存数据副本。使用clojure的集合在发送之前保存副本既简单又高效。

答案 3 :(得分:1)

我想,您需要记住上次使用ref的值更新gui时,才能知道是否需要更新gui。如果该值是一个大的数据结构或更新是昂贵的,这可能是有道理的。