我一直在尝试在Clojure中使用map函数,我想知道将map应用于map集合的最佳实践是什么,以便:
(map #(pprint (str %1 " " %2)) {:hello 1 :world 2})输出(现在顺序并不重要):
:hello 1
:world 2我的第一个想法是:
(def my-map {:hello 1 :world 2})
(map #(pprint (str %1 " " %2)) (keys my-map) (vals my-map))但!我在文档中没有发现任何证据表明Clojure (或例如ClojureScript)保证keys和vals序列的顺序是相互保持的。
另一个想法是:
(map #(pprint (str (first %1) " " (rest %1))) my-map)这并不像普通的%1和%2那样好。
我相信有一种更好的方法可以做到这一点。如果你知道的话,你能分享一下吗?提前感谢!
发布于 2013-06-11 18:33:13
keys和vals确实给出了相同的命令。
或者,您可以在映射的各个条目之间映射函数:
(map (fn [[k v]] ...) {:foo 1 :bar 2})或者使用reduce-kv
(reduce-kv (fn [_ k v] ...) nil {:foo 1 :bar 2})发布于 2013-06-11 21:43:46
map用于在集合上惰性地应用函数以生成新的集合。我会在你真正需要得到的集合时使用它。
但在本例中,您只是枚举k/v对,以避免pprint的副作用,因此请考虑改用doseq:
(doseq [[k v] {:hello 1 :world 2}]
(pprint (str k " " v)))https://stackoverflow.com/questions/17041616
复制相似问题