Concurrency 你能同时将一个数据结构封装在原子和代理中吗?

Concurrency 你能同时将一个数据结构封装在原子和代理中吗?,concurrency,clojure,Concurrency,Clojure,我是Clojure的初学者,我读过它的并发系统,比如atoms、refs和Agent。我似乎找不到文档说明的是,是否可以在不同的系统中包装数据结构以用于不同的功能 假设我将这样表示数据: { :id {:counter 0 :text: ""}, :id2 {:counter 0 :text: ""} } (def myAtom (atom {})) 我想使用atom来更新单个嵌套映射的计数器,因此我定义了如下atom: { :id {:counter 0 :text: ""}, :id

我是Clojure的初学者,我读过它的并发系统,比如atoms、refs和Agent。我似乎找不到文档说明的是,是否可以在不同的系统中包装数据结构以用于不同的功能

假设我将这样表示数据:

 { :id {:counter 0 :text: ""}, :id2 {:counter 0 :text: ""} }
(def myAtom (atom {}))
我想使用atom来更新单个嵌套映射的计数器,因此我定义了如下atom:

 { :id {:counter 0 :text: ""}, :id2 {:counter 0 :text: ""} }
(def myAtom (atom {}))
但我想使用代理只将新的映射结构附加到包装映射中会更方便。 那么,将我的原子封装在下面这样的代理中有意义吗

(def myAgent (agent myAtom))
或者首先定义一个映射并将其分别包装在原子和代理中更有意义吗

(def myMap {})
(def myAtom (atom myMap))
(def myAgent (agent myMap))

还是最好在这些操作中使用两个单独的数据结构,然后在以后合并数据?

下面是您应该如何操作的

(def data (atom {:id {:counter 0 :text ""}, :id2 {:counter 0 :text ""}}))
(println @data)

(swap! data update-in [:id :counter] inc)
(println @data)

(swap! data update-in [:id2 :counter] inc)
(println @data)
结果:

{:id {:counter 0, :text }, :id2 {:counter 0, :text }}
{:id {:counter 1, :text }, :id2 {:counter 0, :text }}
{:id {:counter 1, :text }, :id2 {:counter 1, :text }}

映射是不可变的,因此atom和代理将在不同的版本上运行,并且在其中一个版本中所做的更改不会反映在另一个版本中。