解構地圖

以下是如何構建地圖的方法:

(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]