在 Clojure 中,如果我有一个函数f,
(defn f [& r] ... )
我有一个 seq args和我想调用 f 的参数,我可以很容易地使用apply:
(apply f args)
现在,假设我有另一个函数g,它被设计为采用许多可选的命名参数中的任何一个 - 也就是说,其余参数被解构为映射:
(defn g [& {:keys [a b] :as m}] ... )
我通常会通过执行类似的操作来调用 g
(g :a 1 :b 2)
但是如果我碰巧有一个值为 {:a 1 :b 2} 的地图my-map,并且我想将 g“应用”到 my-map - 换句话说,得到一些最终会作为上述调用的东西,那么我自然不能使用 apply,因为它相当于
(g [:a 1] [:b 2])
有没有很好的方法来处理这个?我可以在我的设计中偏离轨道以结束这个吗?我能找到的最好的解决方案是
(apply g (flatten (seq my-map)))
但我肯定不喜欢它。有更好的解决方案吗?
编辑:对建议的解决方案的轻微改进可能是
(apply g (mapcat seq my-map))
这至少删除了一个函数调用,但可能仍然不太清楚发生了什么。