我有以下作为一个例子:
(def _t2 {:oxnard {:value-type "string" :rec-name "foo"}})
Run Code Online (Sandbox Code Playgroud)
其中:oxnard是动态和未知的先验功能,包含的地图由众所周知的密钥名称组成(例如:value-type和:rec-name).
我试图在不知道外部map关键字的情况下编写具有解构的函数,例如:
(defn if-foo? [ignoremapfirstkey &
{:keys [value-type rec-name]}]
(= rec-name "foo"))
Run Code Online (Sandbox Code Playgroud)
或类似的; 但是,我似乎无法绕过外部密钥名称而不为人所知.
假设您的函数作为参数传递了动态键,您可以使用它来提取内部地图,然后可以使用它来提取内部地图并解构:
(let [{:keys [foo bar]} (get outer-map :inner-key)]
...)
;; k could be a function argument or Var rather than a let local
(let [k :inner-key
{k {:keys [foo bar]}} outer-map]
...)
Run Code Online (Sandbox Code Playgroud)
如果关键是外部地图中总会有一个条目,您可以使用first和val提取内部地图或调用seq地图并解构:
(let [{:keys [foo bar]} (val (first outer-map))]
...)
(let [[[_ {:keys [foo bar]}]] (seq outer-map)]
...)
Run Code Online (Sandbox Code Playgroud)
在后一种情况下,(seq outer-map)将具有表单([k v])(包含一个映射条目的seq); 解构形式中的外部向量解构seq,内部向量解构地图条目,_是您不关心的关键字的占位符,{:keys [foo bar]}并对内部地图进行解构.你必须seq自己在地图上打电话,解构机器不会为你做.
| 归档时间: |
|
| 查看次数: |
520 次 |
| 最近记录: |