Để cập nhật nhiều giá trị, bạn cũng có thể tận dụng lợi thế của việc giảm sử dụng bộ tích lũy đã được lấp đầy và áp dụng một hàm trên đó và mọi thành viên của bộ sưu tập sau.
=> (reduce (fn [a k] (update-in a k inc)) {:a 1 :b 2 :c 3 :d 4} [[:a] [:c]])
{:a 2, :c 4, :b 2, :d 4}
Hãy nhận biết trong những chìa khóa cần phải được kèm theo trong vectơ, nhưng bạn vẫn có thể làm nhiều update-ins trong cấu trúc lồng nhau như bản cập nhật ban đầu trong.
Nếu bạn đã thực hiện nó một chức năng tổng quát, bạn có thể tự động quấn một vector trên một chìa khóa bằng cách kiểm tra nó với coll ?:
(defn multi-update-in
[m v f & args]
(reduce
(fn [acc p] (apply
(partial update-in acc (if (coll? p) p (vector p)) f)
args)) m v))
mà sẽ cho phép single-level/cập nhật quan trọng mà không cần gói các phím trong vectơ
=> (multi-update-in {:a 1 :b 2 :c 3 :d 4} [:a :c] inc)
{:a 2, :c 4, :b 2, :d 4}
nhưng vẫn có thể làm được cập nhật lồng nhau
(def people
{"keith" {:age 27 :hobby "needlefelting"}
"penelope" {:age 39 :hobby "thaiboxing"}
"brian" {:age 12 :hobby "rocket science"}})
=> (multi-update-in people [["keith" :age] ["brian" :age]] inc)
{"keith" {:age 28, :hobby "needlefelting"},
"penelope" {:age 39, :hobby "thaiboxing"},
"brian" {:age 13, :hobby "rocket science"}}
Làm thế nào về một giá trị? Vì vậy, nếu tôi muốn {a: 7: b 4}. Điều gì sẽ xảy ra nếu tôi có một bản đồ các số nguyên và muốn tăng giá trị của câu lệnh key1 => subkey1 => integer ++? –
@DavidWilliams (cập nhật trong bản đồ của tôi [: b] inc) ;; => {: a 1,: b 3} –
OK, điều này tạo ra một bản đồ mới, đúng không? Tôi nghĩ rằng điều này làm cho trạng thái giữ khó hơn. Ví dụ, để tạo một trình phân loại bay, tôi cần phải liên tục cập nhật các thứ được cập nhật trong một cấu trúc đa cấp. key1 => subkey1 => số nguyên. Tôi có cần phải làm một dosync và hoán đổi ma thuật không? –