2

我一直在用mapClojure 中的函数进行试验,并且想知道,应用mapmap集合的最佳实践是什么,以便:

(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)保证keysvals序列的顺序是相互保留的。

另一个想法是:

(map #(pprint (str (first %1) " " (rest %1))) my-map)

这不像普通的%1and那样好%2

我相信有更好的方法来做到这一点。知道的可以分享一下吗?提前致谢!

4

2 回答 2

5

keysvals给出相同的命令。

或者,您可以在映射的条目之间映射一个函数:

(map (fn [[k v]] ...) {:foo 1 :bar 2})

或使用reduce-kv

(reduce-kv (fn [_ k v] ...) nil {:foo 1 :bar 2})
于 2013-06-11T10:33:12.510 回答
4

map用于在集合上延迟应用函数以生成新集合。当您实际需要生成的集合时,我会使用它。

但在这种情况下,您只是在枚举 k/v 对以获得它们的副作用pprint,因此请考虑doseq改用:

(doseq [[k v] {:hello 1 :world 2}]
  (pprint (str k " " v)))
于 2013-06-11T13:43:45.593 回答