首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clojure when-let替代空数组?

clojure when-let替代空数组?
EN

Stack Overflow用户
提问于 2014-11-04 19:27:43
回答 2查看 679关注 0票数 2

我正在尽可能地在clojure中生成json。我的问题是json的某些分支只有在给定参数的情况下才会出现。下面是这种情况的一个示例

代码语言:javascript
复制
(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。

代码语言:javascript
复制
(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,以便我可以清理我的代码,你有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2014-11-05 01:17:12

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

在集合中使用when-let时,请始终使用not-empty

  • to保留
  • refactoring refactoring的集合类型

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

然而,在您的情况下,我更喜欢这样:

代码语言:javascript
复制
...
:metadata {:batch (cond-> {:id uuid}
                       (seq generated-uuids)
                       (assoc :generatedBatches (map ...)))}
...

请注意,上面列出的所有三个优点在没有嵌套let的情况下都满足了要求。

还要注意一个新的优势

  • 更易于扩展,稍后会在

上提供更多条件

票数 4
EN

Stack Overflow用户

发布于 2014-11-04 19:46:05

seq在一个空的输入序列上返回nil,所以你可以这样做:

代码语言:javascript
复制
(when-let [batches (seq (map #(array-map :id %) generated-uuids))]
             {:generatedBatches batches}))}}})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26733991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档