3

我正在尝试从队列中获取 n 条消息(使用 langohr)。我有一个工作版本,但我想知道是否有更好的 clojurist 方法来做到这一点:

(def not-nil? (complement nil?))

(defn get_message [queue] 
   (let [[_ payload] (lb/get ch queue)]
       (if (not-nil? payload)
         (String. payload "UTF-8"))))


(take 4 (take-while not-nil? (repeatedly (partial get_message "my_queue"))))

因此,只要队列中有消息,我最多可以提取 N 条消息。

有没有更好的clojurist方法来做到这一点?

4

1 回答 1

4

not-nil?some?与clojure 1.6中的内置函数相同

习惯用法是-优先使用_在 Clojure 中的绑定名称。

(partial get_message "my_queue")更好,#(get-message "my_queue")因为您显然无意添加 args

(if (some? payload) (String. payload "UTF-8"))

可以表示为

(some-> payload (String. "UTF-8")),

尽管您可能希望保留some->更长的链接,但在这种情况下它仍然更简洁。

所以,把这一切放在一起:

(defn get-message [queue]
  (let [[_ payload] (lb/get ch queue)]
    (some-> payload (String. "UTF-8"))))

(take 4 (take-while some? (repeatedly #(get-message "my_queue"))))
于 2014-11-17T09:46:01.007 回答