[英]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.