在Clojure/conj会谈中,Rich Hickey在有效程序和也许不是中指出了,如果我们不知道某件事,我们应将其留出,即我们在映射中不应有关键字-null(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)))
在调用站点进行检查,并在some附近关联。在我看来这真的很丑,想想多个可选项 - 如何避免嵌套的if-lets?"
(defn person
[line]
(let [ret {:person/name (name line)}]
(if-let [height (height line)]
(assoc ret :person/height height)
ret)))