首页 > 解决方案 > 有没有办法编写一个 clojure 函数来解构地图并返回地图的任何部分?

问题描述

我想编写一个函数,它接受地图的特定结构并返回(打印出)我想要的地图的任何部分。这可能吗?

到目前为止我还没有成功。以下是我为打印地图的 a、b 和 c 部分而编写的函数,但我似乎在整个过程中遗漏了一些逻辑。

测试图是 {:nums {:test number?}}。我真正的目标是返回测试值,即数字?或者用户希望测试的任何值,例如符号?还是矢量?这就是我选择使用这种方法的原因。

我希望了解这就是为什么我选择返回地图的所有部分(即 a、b、c)的逻辑。

谢谢。

(defn des [mapp]
  (let [[a [b c]] [mapp]]
    (println (str a)))
  )
=> #'user/des
(des {:nums {:test number?}})
{:nums {:test #object[clojure.core$number_QMARK_ 0x1089d00e "clojure.core$number_QMARK_@1089d00e"]}}
=> nil


(defn des [mapp]
  (let [[a [b c]] [mapp]]
    (println (str b)))
  )
=> #'user/des
(des {:nums {:test number?}})

=> nil



(defn des [mapp]
  (let [[a [b c]] [mapp]]
    (println (str c)))
  )
=> #'user/des
(des {:nums {:test number?}})

=> nil

标签: clojuredestructuring

解决方案


根据评论,手头的问题是:test在 map 的 map 中找到 any 键。所以some+vals可以用来产生这样的结果:

user=> (some :test (vals {:nums {:test number?}}))
#<Fn@45297e7 clojure.core/number_QMARK_>

这是激进的,因为它假设:test(作为函数)可以在每个映射值上调用(至少在找到结果之前)。


推荐阅读