在 Clojure/conj 演讲《有效的程序》和《可能不是》中,Rich Hickey 指出,如果我们不知道某事,应该将其排除在外,即我们不应该在映射中包含关键字-nil(spec/nilable)对。
如何处理这种情况的最佳方式是什么?
(defn person
[line]
{:person/name (name line) ;; req
:person/height (height line)}) ;; opt, height may return nil
我想出了以下解决方案:
向 'opt' 函数添加额外的arity(参数个数):关键字和映射,这样它们可以条件性地关联。通过threading宏组合所有内容。只适用于您拥有这些函数的情况。
(defn person
[line]
(->> {:person/name (name line)}
(height line :person/height)))
在调用站点执行检查,如果存在则关联。在我看来这真的很丑,想象一下多个可选项 - 如何避免嵌套if-lets?"
(defn person
[line]
(let [ret {:person/name (name line)}]
(if-let [height (height line)]
(assoc ret :person/height height)
ret)))