2014-11-04 2 views
2

Я создаю json буквально, как я могу в clojure. Моя проблема в том, что некоторые ветви json присутствуют только при заданных параметрах. Вот пример такого состоянияclojure когда-let альтернатива для пустого массива?

(defn message-for 
    [name uuid & [generated-uuids]] 
    {:message {:id    (generate-uuid) 
      :details  {:name name} 
      :metadata  {:batch (merge {:id uuid} 
              (when generated-uuids (let [batches (map #(array-map :id %) generated-uuids)] 
                      {:generatedBatches batches})))}}}) 

К сожалению, когда/-ототношение довольно уродливое. То же самое можно было бы сделать, используя if-let, но это не работает, потому что моя карта возвращает [] вместо нуля.

(defn message-for 
    [name uuid & [generated-uuids]] 
    {:message {:id    (generate-uuid) 
      :details  {:name name} 
      :metadata  {:batch (merge {:id uuid} 
              (when-let [batches (map #(array-map :id %) generated-uuids)] 
                  {:generatedBatches batches}))}}}) 

Любые идеи, если бы я мог как-то сделать, когда пусть считают пустой список/массив/SEQ в качестве ложного, чтобы я мог очистить мой код немного?

+0

очевидно, вы знаете, что: ключ generatedBatches не будет создан, если сгенерированные-UUID, пусто. И вы проверяете пустоту сгенерированных uuids в своем первом решении. Таким образом, вы можете сделать свое первое решение короче, как это (когда (seq generated-uuids) {: generatedBatches (map # (array-map: id%) сгенерированные -uuids)}) – mavbozo

ответ

1

seq возвращает NIL на пустой входной последовательности, так что вы можете сделать:

(when-let [batches (seq (map #(array-map :id %) generated-uuids))] 
      {:generatedBatches batches}))}}}) 
3

not-empty возвращает свой аргумент, если он не пуст.

При использовании when-let с коллекцией, всегда используйте not-empty

  • сохранить тип набора
  • сделайте рефакторинга проще
  • expressivenes

    (when-let [batches (not-empty (map ...))] 
        ...) 
    

В вашем случае я однако г что-то вроде этого:

... 
:metadata {:batch (cond-> {:id uuid} 
         (seq generated-uuids) 
         (assoc :generatedBatches (map ...)))} 
... 

Обратите внимание, что все три из преимуществ, перечисленных выше, где встречались, без вложенной let.

заметить также новое преимущество

  • легче расширить с более условий Lateron