在Clojure/conj对话Effective Programs和Maybe Not中,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,以便它们可以条件性地assoc。通过线程宏将一切组合在一起。仅适用于您“拥有”这些函数的情况。
(defn person
[line]
(->> {:person/name (name line)}
(height line :person/height)))
检查调用位置并使用some来assoc。这在我看来真的很丑,想象一下多个optional - 如何避免嵌套if-lets?"
(defn person
[line]
(let [ret {:person/name (name line)}]
(if-let [height (height line)]
(assoc ret :person/height height)
ret)))