在 Clojure/conj 会上,《有效的程序》和《也许不》这两篇演讲中,Rich Hickey 强调,如果我们不知道某些信息,我们应该将其排除在外,也就是说,我们应该不在映射中有keyword-nil (spec/nilable) 对。
如何处理这种情况的最佳方法是什么?
(defn person
[line]
{:person/name (name line) ;; req
:person/height (height line)}) ;; opt, height may return nil
我想到以下解决方案:
为 'opt' 函数添加额外的arity:keyword和map,这样它们可以条件性地使用assoc。通过threading宏组合所有内容。仅适用于你“拥有”这些函数的情况下。
(defn person
[line]
(->> {:person/name (name line)}
(height line :person/height)))
在调用站点上检查,并在有某些情况下使用关联。在我看来这非常丑陋,想象一下多个可选项——如何避免if-let的嵌套?”
(defn person
[line]
(let [ret {:person/name (name line)}]
(if-let [height (height line)]
(assoc ret :person/height height)
ret)))