clojure when-let 空数组的替代方案?

标签 clojure

我正在尽可能在 clojure 中生成 json。我的问题是,只有给定参数时,json 的某些分支才会出现。这是此类情况的示例

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

不幸的是,when/let 部分非常难看。使用 when-let 可以实现相同的效果,如下所示,但它不起作用,因为我的 map 返回 [] 而不是 nil。

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

如果我可以以某种方式使when-let将空列表/数组/seq视为错误,以便我可以稍微清理一下我的代码,有什么想法吗?

最佳答案

not-empty 如果参数不为空,则返回其参数。

当将 when-let 与集合一起使用时,请始终使用 not-empty

  • 保留集合类型
  • 让重构变得更容易
  • 表现力

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

就你而言,我更喜欢这样的东西:

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

请注意,无需嵌套 let,即可满足上面列出的所有三个优点。

还注意到一个新优势

  • 以后更容易扩展更多条件

关于clojure when-let 空数组的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26733991/

相关文章:

clojure - 如何在 Clojure 中设置默认数字格式?

clojure - 如何在 clojure 中获取当前日期 YYYYMMDD?

jdbc - 如何访问 clojure jdbc 插入生成的 key

clojure - Clojure 中的 leiningen :repl-options {:init-ns 'user} for tools. deps 相当于什么?

clojure - "Best Practice"用于使用 native 库的 clojure 库?

clojure - 是否有命名私有(private)函数的 Clojure 约定?

clojure - 如何将 Reduce-Realized 序列转回 Lazy Vector 序列

clojure - 如何在 clojure 中返回之前计算的结果?

clojure - Datomic 的交易 API

concurrency - 从队列中消费的 Clojure 代理