【问题标题】:clojure when-let alternative for an empty array?clojure when-let 替代空数组?
【发布时间】:2014-11-04 11:27:42
【问题描述】:

我在 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 来实现,但它不起作用,因为我的地图返回 [] 而不是 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 视为错误,那么我可以稍微清理一下我的代码,有什么想法吗?

【问题讨论】:

  • 显然,如果 generate-uuids 为空,则不会创建 :generatedBatches 键。而且您确实在第一个解决方案中检查了生成的 uuid 的空性。因此,您可以像这样使您的第一个解决方案更短(when (seq generated-uuids) {:generatedBatches (map #(array-map :id %) generated-uuids)})

标签: clojure


【解决方案1】:

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

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

  • 保留集合类型
  • 使重构更容易
  • 表达能力

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

在你的情况下,我更喜欢这样的东西:

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

请注意,上面列出的所有三个优点都满足了,没有嵌套的let

还注意到一个新的优势

  • 以后更容易扩展,满足更多条件

【讨论】:

    【解决方案2】:

    seq 在空输入序列上返回 nil,因此您可以这样做:

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

    【讨论】:

      猜你喜欢
      • 2015-06-04
      • 2015-10-18
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 2013-05-31
      • 2014-03-21
      • 2014-06-19
      • 1970-01-01
      相关资源
      最近更新 更多