我需要一个简单包装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)
这是我发现自己想要经常做的事情,但我还没有找到一个好方法。有没有惯用的方法呢?
答案 0 :(得分:5)
对合并的参数使用apply
。
(defn my-receive-message
[url & {:as args}]
(apply sqs/receive-message (-> {:queue-url url
:wait-time-seconds 20}
(merge args)
seq
flatten)))
答案 1 :(得分:1)
你总是可以写一个宏:
(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
- 非引号拼接(~@
)照顾隐含地apply
部分。)