3

キューから n 個のメッセージを取得しようとしています (langohr を使用)。私は作業バージョンを持っていますが、これを行うためのより良いクロージュリストの方法があるかどうか知りたいです:

(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 個のメッセージをフェッチします。

これを行うためのより良いクロージュリストの方法はありますか?

4

1 に答える 1

4

not-nil?some?clojure 1.6の組み込み関数と同じです

このイディオムは、Clojure バインディング名-よりも優先して使用することです。_

(partial get_message "my_queue")#(get-message "my_queue")明らかに引数を追加するつもりがないので、より良いです

(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 に答える