将映射应用于函数的剩余参数

2023-11-24

在 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(使用前将#替换为@)

将映射应用于函数的剩余参数 的相关文章

随机推荐