解构地图

以下是如何构建地图的方法:

(def my-map {:a 1 :b 2 :c 3})

然后,例如,在 let 块中,你可以非常简洁地从地图中提取值,如下所示:

(let [{x :a y :c} my-map]
  (println ":a val:" x ", :c val: " y))
;; :a val: 1 , :c val: 3

请注意,每个映射中提取的值都在左侧,与它们关联的键在右侧。

如果要将值解析为具有与键相同名称的绑定,可以使用此快捷方式:

(let [{:keys [a c]} my-map]
  (println ":a val:" a ", :c val: " c))
;; :a val: 1 , :c val: 3

如果你的键是字符串,你可以使用几乎相同的结构:

(let [{:strs [foo bar]} {"foo" 1 "bar" 2}]
  (println "FOO:" foo  "BAR: " bar ))
;; FOO: 1 BAR: 2

对于符号类似:

(let [{:syms [foo bar]} {'foo 1 'bar 2}]
  (println "FOO:" foo "BAR:" bar))
;; FOO: 1 BAR: 2

如果要构建嵌套映射,可以嵌套上面解释的绑定表单:

(def data
  {:foo {:a 1
         :b 2}
   :bar {:a 10
         :b 20}})

(let [{{:keys [a b]} :foo
       {a2 :a b2 :b} :bar} data]
  [a b a2 b2])
;; => [1 2 10 20]