Clojure получить значение вложенной карты
Итак, я привык иметь вложенные массивы или карту настроек в своих приложениях. Я попытался установить один из них в Clojure следующим образом:
(def gridSettings
{:width 50
:height 50
:ground {:variations 25}
:water {:variations 25}
})
И я подумал, знаете ли вы о хорошем способе получения вложенной ценности? Я пробовал писать
(:variations (:ground gridSettings))
Что работает, но это верные слова и довольно громоздки, особенно если я добавлю несколько уровней.
Ответы
Ответ 1
Что делает get-in
:
(get-in gridSettings [:ground :variations])
Из docstring:
clojure.core/get-in
([m ks] [m ks not-found])
Returns the value in a nested associative structure,
where ks is a sequence of keys. Returns nil if the key
is not present, or the not-found value if supplied.
Ответ 2
Вы можете использовать поток первый макрос:
(-> gridSettings :ground :variations)
Я предпочитаю ->
над get-in
за исключением двух особых случаев:
- Когда ключи представляют собой произвольную последовательность, определенную во время выполнения.
- При использовании полезного значения полезно.
Ответ 3
Кроме того, что упоминалось в других ответах (макрос get-in
и ->
), иногда вы хотите получить несколько значений с карты (вложенных или нет), в таких случаях деструктурирование может быть действительно полезным
(let [{{gv :variations} :ground
{wv :variations} :water} gridSettings]
[gv wv])
Ответ 4
Карты - это частичные функции (как в целом). Таким образом, можно просто применить их как функции. На основе карты из вопроса:
(gridSettings :ground)
;=> {:variations 25}
В результате получается карта. Таким образом, он может быть применен снова, что приводит к очень близкому (но не назад) "синтаксису", предложенному в вопросе:
((gridSettings :ground) :variations)
;=>25