簡體   English   中英

如何更新Clojure中ref地圖中的記錄?

[英]How to update records in a ref map in Clojure?

鑒於以下情況:

(defrecord Person [firstname lastname])
(def some-map (ref {}))

(dosync
  (alter some-map conj {1 (Person. "john" "doe")})
  (alter some-map conj {2 (Person. "jane" "jameson")}))

要將“joe”的名字改為“nick”,我會執行以下操作:

(dosync
  (alter some-map (fn [m]                   
                  (assoc m 1 
                       (assoc (m 1) :firstname "nick")))))

在Clojure中這樣做的慣用方法是什么?

無需使用update-in,對於這種情況,assoc-in正是您想要的。

(dosync (alter some-map assoc-in [1 :firstname] "nick"))

編輯:對於您的示例, assoc-in更好,因為您忽略了以前的值。 在實際需要以前值的情況下保留此答案:

update-in用於更新嵌套結構:

(alter some-map update-in [1 :firstname] (constantly "nick"))

最后一個參數是要被“替換”的值的函數(如assoc ,它不替換但返回一個新結構。)在這種情況下,舊值被忽略,因此常常返回“nick”的constantly函數。

暫無
暫無

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

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