[英]Idiomatic way to proxy named parameters in Clojure
我需要一個包含amazonica的sqs/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.