【发布时间】:2013-05-02 20:39:58
【问题描述】:
在 Clojure 中,如果我有一个函数 f,
(defn f [& r] ... )
我有一个序列 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))
这至少删除了一个函数调用,但可能仍然不太清楚发生了什么。
【问题讨论】:
标签: clojure