在 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)))
但我肯定不喜欢它。还有更好的解决方案吗?
EDIT:对建议的解决方案的轻微改进可能是
(apply g (mapcat seq my-map))
这至少删除了一个函数调用,但可能仍然不太清楚发生了什么。
我自己偶然发现了这个问题,并最终定义了期望一张地图的函数。映射可以具有可变数量的键/值对,并且如果足够灵活,则不需要&rest参数。涂抹时也没有疼痛。让生活变得更加轻松!
(defn g [{:keys [a b] :as m}] ... )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)