Clojure:如何更新地图中的多个值

sak*_*979 4 clojure

我有一个包含多个计数器的地图,例如:

(def m1 (atom {:counter1 10 :counter2 3 :counter3 11}))
;;;=> {:counter1 10, :counter3 11, :counter2 3}
Run Code Online (Sandbox Code Playgroud)

我想将counter2加1,并将counter1和counter3重置为零.

我似乎无法想办法.我遇到的最好的是以下功能.但是,此函数不会将counter1和counter3重置为零,它只是不会递增它们.

(swap! m1 (fn [m]
            (merge-with + m {:counter1 0
                             :counter2 1
                             :counter3 0})))
;;;=> {:counter1 10, :counter3 11, :counter2 4}
Run Code Online (Sandbox Code Playgroud)

是否可以通过单次交换执行我要求的操作!或者我是否需要通过调用swap来实现!和多次重置!

cfr*_*ick 6

或者分开两个操作:

(swap! m1 #(-> % 
           (update :counter2 inc) 
           (assoc :counter1 0 :counter3 0)))
Run Code Online (Sandbox Code Playgroud)

编辑

如果您使用的是<1.7 Clojure版本,请使用update-in而不是update


The*_*Fox 5

把事情简单化!使用法线merge:counter2再次从地图访问。

(swap! m1 (fn [m]
            (merge m {:counter1 0
                      :counter2 (-> m :counter2 inc)
                      :counter3 0})))
Run Code Online (Sandbox Code Playgroud)