4

给定一个 map {:a 1 :b [2,3]},是否有一个内置函数可以返回 sequence (:a 1 :b [2,3])

用例是将选项映射应用于对参数列表的其余部分进行映射解构绑定的函数。这是 core.cache 中的一个示例。这是一个人为的例子来说明:

(defn make-car [& {:as options}] (assoc options :car true))
(make-car :color "red" :speed "fast")
; => {:car true, :speed "fast", :color "red"}

现在,如果我们想单独管理选项并将apply它们管理到函数中,我们就会遇到问题:

(def options {:color "red" :speed "fast"})
(apply make-car options)
; => {:car true, [:speed "fast"] [:color "red"]}

...因为seq地图的当然是其键值对的序列。这是我想出的最好的:

(apply make-car (interleave (keys options) (vals options)))
; => {:car true, :speed "fast", :color "red"}

这太可怕了。我知道我可以创建自己的函数来执行此操作,但我很惊讶我没有找到内置的东西。如果没有内置的东西,那么我可能想避免在库代码中像这样解构参数列表。

4

1 回答 1

5

这个怎么样:

(reduce concat {:a 1 :b [2,3]})
(:a 1 :b [2 3])

根据 amalloy 的评论进行更新Apply 效率更高(至少在 1.4 中),并且达到了相同的结果!

(apply concat {:a 1 :b [2,3]})
(:a 1 :b [2 3])
于 2012-10-07T16:37:53.200 回答