對金鑰名稱進行解構和繫結

有時在解構對映時,你希望將結構化值繫結到它們各自的鍵名。根據資料結構的粒度,使用標準解構方案可能有點冗長

比方說,我們有一個基於地圖的記錄,如下所示:

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