簡體   English   中英

Clojure:如何更新地圖中的多個值

[英]Clojure: how to update multiple values in a map

我有一個包含多個計數器的地圖,例如:

(def m1 (atom {:counter1 10 :counter2 3 :counter3 11}))
;;;=> {:counter1 10, :counter3 11, :counter2 3}

我想將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}

是否可以通過單次交換來執行我要求的操作!或者我是否需要通過調用swap來實現! 和多次重置!

或者分開兩個操作:

(swap! m1 #(-> % 
           (update :counter2 inc) 
           (assoc :counter1 0 :counter3 0)))

編輯

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

把事情簡單化! 使用正常的merge並從地圖再次訪問:counter2

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

好吧,您可以修改代碼來執行此操作,方法是將merge-with inside中的+替換為其他函數:

(defn my-plus [old new] (if (pos? new) (+ new old) 0))

我仍然在考慮解決它的不同方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM