2013-08-21 8 views
2

나는 Clojure에 매우 익숙하며 좋은 오픈 소스 코드를 읽음으로써 Clojure를 배웠다. 그래서 나는 반지를 선택하고 코드를 읽기 시작하지만 assoc-query-params 함수에 갇혀있다. (ring.middleware/params.clj에 위치)Clojure에서 단순 병합 대신 merge-with가 사용되는 이유는 무엇입니까?

그리고 "병합"이 사용되는 이유를 이해할 수 없습니다. 누구든지이 코드 스 니펫을 이해하는 데 도움이 될 수 있습니까?

merge 기능의
(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 {}}))) 

답변

4

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을 확장하는 것이라고 생각 취급 데.