首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用未知键解构地图

用未知键解构地图
EN

Stack Overflow用户
提问于 2014-02-09 23:36:00
回答 2查看 698关注 0票数 3

我有以下例子:

代码语言:javascript
复制
(def _t2 {:oxnard {:value-type "string" :rec-name "foo"}})

其中,:oxnard,动态的,未知的函数,包含的映射由著名的密钥名(例如:value-type:rec-name)组成。

我试图在不知道外部map关键字的情况下编写一个具有析构的函数,例如:

代码语言:javascript
复制
(defn if-foo? [ignoremapfirstkey & 
  {:keys [value-type rec-name]}] 
  (= rec-name "foo"))

或者类似的;然而,我似乎无法绕开外键名--不为人所知。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-10 00:09:45

假设将动态键作为参数传递给您的函数,您可以使用它提取内部映射,然后使用它提取内部映射并构造如下:

代码语言:javascript
复制
(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并对其进行重构:

代码语言:javascript
复制
(let [{:keys [foo bar]} (val (first outer-map))]
  ...)

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

在后一种情况下,(seq outer-map)将有表单([k v]) (包含一个映射条目的seq );析构表单中的外部向量破坏seq,内部向量破坏映射条目,_是您不关心的键的占位符,{:keys [foo bar]}破坏内部映射。你必须自己给地图上的seq打电话,破坏机器不会为你这么做的。

票数 5
EN

Stack Overflow用户

发布于 2014-02-10 02:07:39

那这个呢?

代码语言:javascript
复制
(defmacro somekey
  [complex-map]
  (let [k (first (keys complex-map))]    ; get key from the outer map
    `(let [{inner-map# ~k} ~complex-map] ; use it for destructuring
        inner-map#)))                    ; make this as complex as you want

也许这里有个缺陷,我冒着被否决的危险,但这似乎奏效了。也许比米哈尔的答案更实用,即便如此。(当然,在其他条件相同的情况下,最好避免宏,除非它们是真正必要的。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21666636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档