假设我有一张这样的 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/