簡體   English   中英

clojure-破壞宏內的映射的麻煩

[英]clojure - trouble destructing map inside macro

我是Clojure的新手,所以請多多包涵。

這樣編寫宏:

 `(let [query#   (:query-params ~'+compojure-api-request+)
        options# (select-keys query# [:sort-by :from :to])])

let塊的第一行從http request解構了一個query-params -產生了以下結構:

{sort-by billing-account/name, from 0, to 10, payment-due , payment-method , search }

問題出在第二行–當我使用select-keys ,它返回一個空的映射,但是當我說(first query#) ,輸出看起來像這樣: [sort-by billing-account/name]

誰能解釋一下為什么select-keys不起作用?

PS嘗試過(get query# :from) & (:from query#) -那里也沒有運氣。

UPD

鍵是字符串,而不是關鍵字-因此,將字符串用作鍵就可以了。

順便說一句,您也可以使用:strs來解構字符串鍵:

(let [m {"sort-by" "billing-account/name", 
         "from" "0",
         "to" "10", 
         "payment-due" nil, 
         "payment-method", "search"}
      {:strs [sort-by from to payment-due payment-method]} m]
  (println sort-by from to payment-due payment-method))

;;=> billing-account/name 0 10 nil search     

有關解構語法的完整說明,請參見https://clojure.org/guides/destructuring

我認為關鍵字,符號和字符串之間的差異會讓您感到困惑。 在您的評論中,您說它們是符號,但在編輯中,您說它們是字符串。

您應該閱讀其中的區別:

習慣用法是通常更喜歡使用關鍵字作為映射鍵,盡管來自互聯網的內容(json,http標頭等)有時全都是字符串。

為了直接回答您的問題,傳遞給select-keys必須與映射中select-keys相同(使用=函數),因此在這種情況下,它們必須為相同類型。

;; For example

(select-keys {'foo 1 'bar 2} ['foo]) ;=> {foo 1}

(select-keys {:foo 1 :bar 2} [:foo]) ;=> {:foo 1}

(select-keys {"foo" 1 "bar" 2} ["foo"]) ;=> {"foo" 1}

我也質疑是否需要將此作為宏,是否有一個普通函數無法正常工作的原因?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM