我有一个包含多个计数器的地图,例如:
(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来实现!和多次重置!
或者分开两个操作:
(swap! m1 #(-> %
(update :counter2 inc)
(assoc :counter1 0 :counter3 0)))
Run Code Online (Sandbox Code Playgroud)
编辑
如果您使用的是<1.7 Clojure版本,请使用update-in而不是update
把事情简单化!使用法线merge并:counter2再次从地图访问。
(swap! m1 (fn [m]
(merge m {:counter1 0
:counter2 (-> m :counter2 inc)
:counter3 0})))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1098 次 |
| 最近记录: |