我正在研究 Clojure 中的解构。我学到了一点,现在我可以解构两层嵌套的地图了。我怎样才能解构最深的嵌套地图?我在这里留下了一张我试图重组的示例地图。你能给我一些简单易懂的例子来说明如何解构嵌套的地图吗?
(def my-nested-map-2 {:id 1 :name {:first "ali" :last "veli"}})
(let [{id :id {first :first, last :last} :name} my-nested-map-2]
(println id first last))
;==>this map I would like to destructure.
(def my-nested-map-3 {:id 1 :name {:first "ali" :last "veli"} :surname {:snf "foo" :snl "bar" :location {:country "usa"}} :age 26})
与最初嵌套解构的方式完全相同,但更深一层。请注意我是如何使用
:keys
来避免重复名字的:
(let [{:keys
[id age]
{:keys [first last]}
:name
{:keys [snf snl], {:keys [country]} :location}
:surname}
my-nested-map-3]
...)
但请注意,我还在顶部添加了相当多的格式以使其易于理解。嵌套解构通常会使事情变得比它们需要的更混乱。例如。请注意这段代码有多简洁,其中只有一层解构:
(let [{:keys [id name surname age]} my-nested-map-3
{:keys [first last]} name
{:keys [snf snl location]} surname
;; Why is `location` under `:surname` in the first place?
{:keys [location]} surname]
...)
在这种特殊情况下,唯一的缺点是它为本地范围带来了比需要更多的名称,甚至隐藏了内置的
name
。如果这是一个问题,您始终可以在其中一个解构中重命名事物,或者避免使用显式吸气剂的单个级别,例如(:name my-nested-map-3)
.
虽然原生解构就足够了,但我经常发现使用 plumbing 库更容易。
(use '[plumbing.core])
(let [data {:id 1 :name {:first "ali" :last "veli"}
:surname {:snf "foo" :snl "bar" :location {:country "usa"}}
:age 26}]
(letk [[id name surname] data
[first last] name
[snf snl location] surname
[country] location]
country))