Имейте в виду, что, поскольку mymap является неизменным, поэтому вызов (update mymap :a (constantly 5))
или (assoc mymap :a 5)
вернет карту {:a 5 :b 15}
, дальнейшие ссылки на mymap продолжат возвращать исходное значение {:a 10 :b 15}
.
Если вы хотите обновить значение для последующих вызовов, вы можете посмотреть на использование атомов.
(defonce mymap (atom {:a 10 :b 15}))
(defn change-mymap [value]
(swap! mymap #(assoc % :a value)))
Просто убедитесь, что когда вы хотите сослаться на значение атома, вы разыменовываете его символом @. Например: (clojure.pprint/pprint @mymap)
Когда вы вызываете (change-mymap 5)
, это обновит сохраненное значение mymap, чтобы установить :a
на новое значение, оставив любые другие пары ключ-значение на вашей карте в одиночку. Это может быть полезно при отображении обновленного состояния в коде клиент / сервер при ответе на входы из другой системы.
Также обратите внимание, что для вложенных карт, таких как
(defonce nested (atom {:a "a value"
:b {:inner "Another value"
:count 3
:another {:value 5}}}))
Вы можете адресовать конкретное значение в вашей карте с помощью вектора пути. Вы можете использовать функцию get-in
для получения значения (get-in @nested [:b :another :value])
и вы можете использовать assoc-in
или update-in
с путем для обновления значений. Это также позволяет расширить карту. Например, с указанным выше значением вложенности вы можете добавить целый раздел в дерево:
(swap! nested #(assoc-in % [:a :b :c :d] "foo"))
обновит исходную карту, чтобы она выглядела так:
{:a {:b {:c {:d "foo"}}}
:b {:inner "Another value"
:count 3
:another {:value 5}}}