首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么合并-和是使用而不是简单的‘合并’在环,Clojure?

为什么合并-和是使用而不是简单的‘合并’在环,Clojure?
EN

Stack Overflow用户
提问于 2013-08-21 01:55:32
回答 1查看 186关注 0票数 2

我对Clojure非常陌生,我通过阅读良好的开源代码来学习Clojure。所以我选择了Ring,开始读代码,但是被assoc-query函数卡住了。(位于中间件/参数/中)

我不明白为什么要用“合并”。有人能帮我理解这个代码片段吗?

代码语言:javascript
复制
(defn- assoc-query-params
  "Parse and assoc parameters from the query string with the request."
  [request encoding]

  ; I think (merge request (some-form)) is enough
  ; but the author used merge-with with merge function.

  (merge-with merge request
    (if-let [query-string (:query-string request)]
      (let [params (parse-params query-string encoding)]
        {:query-params params, :params params})
      {:query-params {}, :params {}})))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-21 02:17:22

下面是描述merge函数:重措辞,它说,如果一个键被满足不止一次,在最新的地图中将被选择值。在您发布的示例中,这意味着:query-params :params的值将从函数的尾部获取,而不是将它们与请求中的值组合起来。

让我们看看这个例子:

代码语言:javascript
复制
(def m {:a {:a-key1 "value1"} :b {:b-key1 "value3"} :c {}})
(def m2 {:a {:a-key2 "value2"} :b {}})

(merge m m2)
;-> {:a {:a-key2 "value2"}, :b {}, :c {}}

(merge-with merge m m2)
;-> {:a {:a-key1 "value1", :a-key2 "value2"}, :b {:b-key1 "value3"} :c {}}

因此,(merge-with merge ...)构造为我们提供了一种将地图中的映射合并的方法。您可以这样看待它: merge - will将所有键/值对按键分组(在我们的示例中为:a :b :c ),并将合并应用于它们的值。

代码语言:javascript
复制
{:a (merge {:a-key1 "value1"} {:a-key2 "value2"}) 
 :b (merge {:b-key1 "value3"} {})
 :c (merge {})}

在处理了这些问题之后,我认为assoc-query-params作者的初衷是扩展:query-params:params,而不是完全取代它们。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18347681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档