如何更新Clojure中ref地图中的记录?

Odi*_*din 6 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")}))
Run Code Online (Sandbox Code Playgroud)

要将"joe"的名字改为"nick",我会执行以下操作:

(dosync
  (alter some-map (fn [m]                   
                  (assoc m 1 
                       (assoc (m 1) :firstname "nick")))))
Run Code Online (Sandbox Code Playgroud)

在Clojure中这样做的惯用方法是什么?

Joo*_*aat 5

无需使用update-in,对于这种情况,assoc-in正是您想要的.

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