在不知道 Clojure 中的键的情况下如何将映射解构为键值对?
How do you destructure a map into key-value pairs without knowing the keys in Clojure?
假设我有这样一张地图
{:a 1 :b 2 :c 3}
我想像这样映射(注意 - 非工作伪代码):
(mapcat (fn [[:key key-a][:value value-a]] (println "key: " key-a "\n value: " value-a )))
如果不首先获取函数的键,映射这些键并从函数中读回它们,这是否可能?
我的问题是:如何在不知道 Clojure 中的键的情况下将映射解构为键值对?
当您 map
遍历地图时,每个元素都是一个包含两个值的向量:键和值。你用这样的向量解构每个元素:
(def m {:a 1 :b 2 :c 3})
(map (fn [[key value]] (str "key: " key " > value: " value-a)) m)
请注意,传递给 map
returns 的函数是一个字符串值,而不是您对 println
的调用,因为我们试图通过应用作用于每个值。您可以将 map
返回的集合传递给 prn
以调试该值,尽管 REPL 无论如何都会为您打印出来。
(seq {:a 1 :b 2 :c 3})
;([:a 1] [:b 2] [:c 3])
在地图上调用 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
作为一对得到
键和值。
- 使用
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
... 和 returns nil
。
假设我有这样一张地图
{:a 1 :b 2 :c 3}
我想像这样映射(注意 - 非工作伪代码):
(mapcat (fn [[:key key-a][:value value-a]] (println "key: " key-a "\n value: " value-a )))
如果不首先获取函数的键,映射这些键并从函数中读回它们,这是否可能?
我的问题是:如何在不知道 Clojure 中的键的情况下将映射解构为键值对?
当您 map
遍历地图时,每个元素都是一个包含两个值的向量:键和值。你用这样的向量解构每个元素:
(def m {:a 1 :b 2 :c 3})
(map (fn [[key value]] (str "key: " key " > value: " value-a)) m)
请注意,传递给 map
returns 的函数是一个字符串值,而不是您对 println
的调用,因为我们试图通过应用作用于每个值。您可以将 map
返回的集合传递给 prn
以调试该值,尽管 REPL 无论如何都会为您打印出来。
(seq {:a 1 :b 2 :c 3})
;([:a 1] [:b 2] [:c 3])
在地图上调用 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
作为一对得到
键和值。 - 使用
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
... 和 returns nil
。