3

我需要一个对amazonica进行薄包装的函数,sqs/receive-message以便添加默认等待时间。该函数需要一个队列 URL,然后接受任意数量的可选命名参数,这些参数应该传递给sqs/receive-messageuntouched。我想这样称呼它:

(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)

这是我发现自己经常想做的事情,但我还没有找到一个好的方法。有没有一种惯用的方法来做到这一点?

4

2 回答 2

5

使用apply合并的参数。

(defn my-receive-message
  [url & {:as args}]
  (apply sqs/receive-message (-> {:queue-url url
                                  :wait-time-seconds 20}
                                 (merge args)
                                 seq 
                                 flatten)))
于 2014-03-06T15:09:34.647 回答
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隐式处理该部分。)

于 2014-03-06T17:50:03.610 回答