在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)))
在调用位置进行检查,并在一些情况下进行assoc。在我看来,这真的很丑,想象一下多个optionals - 如何避免嵌套if-lets?"
(defn person
[line]
(let [ret {:person/name (name line)}]
(if-let [height (height line)]
(assoc ret :person/height height)
ret)))