对密钥名称进行解构和绑定

有时在解构映射时,你希望将结构化值绑定到它们各自的键名。根据数据结构的粒度,使用标准解构方案可能有点冗长

比方说,我们有一个基于地图的记录,如下所示:

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