我以以下为例:

(def _t2 {:oxnard {:value-type "string" :rec-name "foo"}})

其中 :oxnard 动态和未知的先验函数 并且包含的​​映射由众所周知的键名组成(例如 :value-type:rec-name )。

我试图在不知道外层 map 关键字的情况下编写一个带有解构的函数,例如:
(defn if-foo? [ignoremapfirstkey &
  {:keys [value-type rec-name]}]
  (= rec-name "foo"))

或类似的;但是,我似乎无法绕过不为人知的外键名称。

最佳答案

假设您的函数通过动态键作为参数传递,您可以使用它来提取内部映射,然后可以使用它来提取内部映射并解构:

(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]
  ...)

如果重点是外层映射中总是只有一个条目,您可以使用 firstval 来提取内层映射或在映射上调用 seq 并解构:
(let [{:keys [foo bar]} (val (first outer-map))]
  ...)

(let [[[_ {:keys [foo bar]}]] (seq outer-map)]
  ...)

在后一种情况下,(seq outer-map) 的形式为 ([k v])(一个包含一个映射条目的序列);解构形式中的外部向量解构 seq,内部向量解构映射条目,_ 是您不关心的键的占位符,{:keys [foo bar]} 解构内部映射。您必须自己在 map 上调用 seq,解构机制不会为您执行此操作。

关于clojure - 具有未知键的 map 解构图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21666636/

10-11 15:39