在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,以便它们可以条件性地assoc。通过threading宏组合一切。仅适用于您拥有那些函数。
(defn person
[line]
(->> {:person/name (name line)}
(height line :person/height)))
检查调用位置,如果some的话,就assoc。在我看来,这真的很丑,想象一下有多个可选退路 - 如何避免if-lets的嵌套?
(defn person
[line]
(let [ret {:person/name (name line)}]
(if-let [height (height line)]
(assoc ret :person/height height)
ret)))