【问题标题】:Why merge-with is used instead of simple 'merge' in Ring, Clojure?为什么在 Ring、Clojure 中使用合并而不是简单的“合并”?
【发布时间】:2013-08-21 01:55:32
【问题描述】:

我对 Clojure 很陌生,通过阅读来学习 Clojure 很好的开源代码。所以我选择 Ring 并开始阅读 代码但卡在 assoc-query-params 函数中。 (位于ring.middleware/params.clj

我不明白为什么要使用“合并”。 谁能帮我理解这段代码 sn-p?

(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 {}})))

【问题讨论】:

    标签: clojure ring


    【解决方案1】:

    merge 函数的Here's the description:改写它表示如果多次遇到键,则将选择最新映射中的值。在您发布的示例中,这意味着 :query-params :params 的值将按原样从函数的尾部获取,而不是将它们与请求中的内容相结合。

    我们来看例子:

    (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-with 将按键(在我们的示例中为:a:b:c)对所有键/值对进行分组,并对它们的值应用合并。

    {:a (merge {:a-key1 "value1"} {:a-key2 "value2"}) 
     :b (merge {:b-key1 "value3"} {})
     :c (merge {})}
    

    处理完我觉得assoc-query-params作者的初衷是扩展:query-params:params而不是完全替换它们。

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 2018-07-29
      相关资源
      最近更新 更多