Вы можете использовать функции assoc-in
, get-in
, update-in
и dissoc-in
для работы с вложенными структурами.
Они очень удобны, но я не знаю, смогут ли они справитьсяатомы и такие напрямую.В худшем случае вы должны иметь возможность вложить их до разыменования, например:
(def m (atom {:like {:this {:nested (atom {:value 5})}}}))
@(get-in @m [:like :this :nested])
; => {:value 5}
(get-in @(get-in @m [:like :this :nested]) [:value])
; => 5
Вы можете использовать ->
, чтобы сделать это более читабельным:
(-> @m
(get-in [:like :this :nested])
deref
(get-in [:value]))
; => 5
Относительно вложенных атомов/ refs / агентов и т. д. Я думаю, это зависит от того, чего вы пытаетесь достичь.Разумеется, легче рассуждать о вещах, если только одна из них сверху и изменения синхронизированы.
С другой стороны, если вам не нужна эта синхронизация, вы тратите время на выполнениеэто, и вам будет лучше с вложенными атомами / ссылками / агентами.
Суть в том, что я не думаю, что в любом случае "правильный путь", у них обоих есть свои применения.