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

Dictionary 如何在不知道Clojure中的键的情况下将映射分解为键值对?,dictionary,clojure,destructuring,Dictionary,Clojure,Destructuring,假设我有一张这样的地图 {:a 1 :b 2 :c 3} 我想这样映射(注意-非工作伪代码): 如果不先获取函数的键,映射这些键并从函数中读回它们,这是可能的吗 我的问题是:如何在不知道Clojure中的键的情况下将映射分解为键值对?当在映射上映射时,每个元素都是包含两个值的向量:键和值。使用如下向量分解每个元素: (def m {:a 1 :b 2 :c 3}) (map (fn [[key value]] (str "key: " key " > value: " value-a))

假设我有一张这样的地图

{:a 1 :b 2 :c 3}
我想这样映射(注意-非工作伪代码):

如果不先获取函数的键,映射这些键并从函数中读回它们,这是可能的吗


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

当在映射上映射时,每个元素都是包含两个值的向量:键和值。使用如下向量分解每个元素:

(def m {:a 1 :b 2 :c 3})
(map (fn [[key value]] (str "key: " key " > value: " value-a)) m)
请注意,传递给
map
的函数返回一个字符串值,而不是调用
println
,因为我们试图通过对每个值应用函数来转换传入的集合。您可以将
map
返回的集合传递到
prn
以调试该值,尽管REPL将为您打印出来

(seq {:a 1 :b 2 :c 3})
;([:a 1] [:b 2] [:c 3])
在映射上调用
seq
,可以得到一系列键值对。
seq
调用通常是隐式的

成对的

  • 不需要在输入的订单中
  • 实际上是
    MapEntry
    s,它们的行为是成对的
因此

你的伪代码

(mapcat (fn [[:key key-a][:value value-a]] (println "key: " key-a "\n value: " value-a )))
。。。需要几次修理:

  • 提供省略的最终参数-映射到的集合 应用
  • 只需将每个
    MapEntry
    分解为一对即可获得
    关键和价值
  • 使用
    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}))
哪张照片

。。。并返回
nil

(mapcat (fn [[:key key-a][:value value-a]] (println "key: " key-a "\n value: " value-a )))
(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