對金鑰名稱進行解構和繫結
有時在解構對映時,你希望將結構化值繫結到它們各自的鍵名。根據資料結構的粒度,使用標準解構方案可能有點冗長。
比方說,我們有一個基於地圖的記錄,如下所示:
(def john {:lastname "McCarthy" :firstname "John" :country "USA"})
我們通常會這樣解構它:
(let [{lastname :lastname firstname :firstname country :country} john]
(str firstname " " lastname ", " country))
;;"John McCarthy, USA"
在這裡,資料結構非常簡單,只有 3 個插槽( 名字,姓氏,國家 ),但想象一下,如果我們必須重複所有的金鑰名兩次以獲得更細粒度的資料結構(擁有更多的插槽而不僅僅是 3 個),那將是多麼麻煩。
相反,更好的處理方法是使用:keys
(因為我們的鍵是關鍵字 ),並選擇我們想要繫結的鍵名,如下所示:
(let [{:keys [firstname lastname country]} john]
(str firstname " " lastname ", " country))
;;"John McCarthy, USA"
相同的直觀邏輯適用於其他鍵型別,如符號 (使用:syms
)和普通舊字串 (使用:strs
)
;; using strings as keys
(def john {"lastname" "McCarthy" "firstname" "John" "country" "USA"})
;;#'user/john
;; destructuring string-keyed map
(let [{:strs [lastname firstname country]} john]
(str firstname " " lastname ", " country))
;;"John McCarthy, USA"
;; using symbols as keys
(def john {'lastname "McCarthy" 'firstname "John" 'country "USA"})
;; destructuring symbol-keyed map
(let [{:syms [lastname firstname country]} john]
(str firstname " " lastname ", " country))
;;"John McCarthy, USA"