我正在尽可能地在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}))}}})如果我能以某种方式使一个空列表/数组/seq为false,以便我可以清理我的代码,你有什么想法吗?
发布于 2014-11-05 01:17:12
如果参数不为空,则not-empty返回其参数。
在集合中使用when-let时,请始终使用not-empty
(when-let batches (not-empty (map...)) ...)
然而,在您的情况下,我更喜欢这样:
...
:metadata {:batch (cond-> {:id uuid}
(seq generated-uuids)
(assoc :generatedBatches (map ...)))}
...请注意,上面列出的所有三个优点在没有嵌套let的情况下都满足了要求。
还要注意一个新的优势
上提供更多条件
发布于 2014-11-04 19:46:05
seq在一个空的输入序列上返回nil,所以你可以这样做:
(when-let [batches (seq (map #(array-map :id %) generated-uuids))]
{:generatedBatches batches}))}}})https://stackoverflow.com/questions/26733991
复制相似问题