Подтвердить что ты не робот

Clojure получить значение вложенной карты

Итак, я привык иметь вложенные массивы или карту настроек в своих приложениях. Я попытался установить один из них в Clojure следующим образом:

(def gridSettings
  {:width 50
   :height 50
   :ground {:variations 25}
   :water {:variations 25}
   })

И я подумал, знаете ли вы о хорошем способе получения вложенной ценности? Я пробовал писать

(:variations (:ground gridSettings))

Что работает, но это верные слова и довольно громоздки, особенно если я добавлю несколько уровней.

4b9b3361

Ответ 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