簡體   English   中英

在Clojure中代理命名參數的慣用方法

[英]Idiomatic way to proxy named parameters in Clojure

我需要一個包含amazonicasqs/receive-message的函數,以便添加默認的等待時間。 該函數需要一個隊列URL,然后接受任意數量的可選命名參數,這些參數應該傳遞給未sqs/receive-message 我想這樣稱呼它:

(my-receive-message "https://sqs.us-east-1.amazonaws.com/123/test-q"
                    :max-number-of-messages 10
                    :delete true)

這應該導致調用sqs/receive-message如下所示:

(sqs/receive-message :queue-url "https://sqs.us-east-1.amazonaws.com/123/test-q"
                     :wait-time-seconds 20
                     :max-number-of-messages 10
                     :delete true)

這是我發現自己想要經常做的事情,但我還沒有找到一個好方法。 這是否有慣用的方法?

使用apply over merged參數。

(defn my-receive-message
  [url & {:as args}]
  (apply sqs/receive-message (-> {:queue-url url
                                  :wait-time-seconds 20}
                                 (merge args)
                                 seq 
                                 flatten)))

你總是可以寫一個宏:

(defmacro my-receive-message [url & opts]
  `(sqs/receive-message 
      ~@(flatten (seq (merge {:queue-url url :wait-time-seconds 20}
                             (apply hash-map opts))))))

(請注意,這與Guillermo的功能幾乎完全相同。主要區別在於您不必apply sqs/receive-message - unquote-splicing( ~@ )隱式處理apply部分。 )

暫無
暫無

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

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