在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' 函数添加额外的参数:关键字和映射,这样它们可以条件性地关联。通过线程宏组合所有内容。只有在你“拥有”这些函数时才适用。
(defn person
[line]
(->> {:person/name (name line)}
(height line :person/height)))
检查调用站点并在some上关联。在我来看,这真的很丑陋,想象一下多个可选项 - 如何避免多层if-let?
(defn person
[line]
(let [ret {:person/name (name line)}]
(if-let [height (height line)]
(assoc ret :person/height height)
ret)))