dictionary - 如何在不知道 Clojure 中的键的情况下将映射分解为键值对?

标签 dictionary clojure destructuring

假设我有一张这样的 map

{:a 1 :b 2 :c 3}

我想像这样映射这个(注意 - 非工作伪代码):

(mapcat (fn [[:key key-a][:value value-a]] (println "key: " key-a "\n value: " value-a )))

如果不先获取函数的键、映射这些键并从函数中读取它们,这是否可行?

我的问题是:如何在不知道 Clojure 中键的情况下将映射分解为键值对?

最佳答案

(seq {:a 1 :b 2 :c 3})
;([:a 1] [:b 2] [:c 3])

在 map 上调用 seq 会为您提供一系列键值对。 seq 调用通常是隐式的。

  • 不必按照输入的顺序;
  • 实际上是 MapEntry,它们的行为是成对的。

这样

(type (first {:a 1 :b 2 :c 3}))
;clojure.lang.MapEntry

你的伪代码

(mapcat (fn [[:key key-a][:value value-a]] (println "key: " key-a "\n value: " value-a )))

...需要多次维修:

  • 提供省略的最终参数 - map 的集合 已应用。
  • 只需将每个 MapEntry 解构为一对即可获得
    关键和值(value)。
  • 使用 map 而不是 mapcat 将函数应用于每一对。 mapcat 能正常工作真是太幸运了。
  • 使用 dorun 强制序列进行评估并将其丢弃为 它这样做了。 REPL 为您完成前者,但运行 应用程序不需要。

这给了我们

(dorun
 (map 
  (fn [[key-a value-a]] (println "key: " key-a " value: " value-a ))
  {:a 1 :b 2 :c 3}))

打印

key:  :a  value:  1
key:  :c  value:  3
key:  :b  value:  2

... 返回 nil

关于dictionary - 如何在不知道 Clojure 中的键的情况下将映射分解为键值对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28408743/

相关文章:

Python循环整个字典

multithreading - 在 clojure 中使用 at-at 库时应用程序不退出

rust - 如何在 Rust 中解构和取消引用元组

python - 为什么解构增强赋值不可能?

macros - 让表格: How to access destructured symbols in a macro?

ios - 如何快速从字典中获取所有索引值?

python - 在 python 中按特定顺序对元素进行排序

ios - 实例化存储在元类型字典中的类

concurrency - 等待一系列 promise ?

concurrency - 在下面的 Clojure 代码中,alter 可以替换为 Commute 吗?