我正在尽可能在 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/