在Clojure中,如果我有一个函数f,
(defn f [& r] ... )
Run Code Online (Sandbox Code Playgroud)
并且我有一个seq args,其中包含我想要调用的参数,我可以轻松地使用apply:
(apply f args)
Run Code Online (Sandbox Code Playgroud)
现在,假设我有另一个函数g,它被设计为采用任意一些可选的命名参数 - 也就是说,其余参数被解构为map:
(defn g [& {:keys [a b] :as m}] ... )
Run Code Online (Sandbox Code Playgroud)
我通常会做类似的事情来称呼g
(g :a 1 :b 2)
Run Code Online (Sandbox Code Playgroud)
但是如果我碰巧有一张地图my-map,其值为{:a 1:b 2},我想将"g"应用到我的地图上 - 换句话说,得到一些最终会成为上述调用的内容,然后我自然不能使用申请,因为它相当于
(g [:a 1] [:b 2])
Run Code Online (Sandbox Code Playgroud)
有一个很好的方法来处理这个?我的设计可能会偏离轨道吗?我能找到的最佳解决方案是
(apply g (flatten (seq my-map)))
Run Code Online (Sandbox Code Playgroud)
但我肯定不喜欢它.更好的解决方案?
编辑:建议的解决方案可能略有改进
(apply g (mapcat seq my-map))
Run Code Online (Sandbox Code Playgroud)
至少删除一个函数调用,但它可能仍然不是很清楚正在发生什么.
我自己偶然发现了这个问题,最后定义了一个期望一个地图的函数.映射可以具有可变数量的键/值对,并且如果足够灵活,则不需要&rest参数.申请也没有痛苦.让生活更轻松!
(defn g [{:keys [a b] :as m}] ... )
Run Code Online (Sandbox Code Playgroud)