在Clojure/conj演讲中,《有效程序》和《也许不是》中,Rich Hickey指出,如果不知道某事物,应该将其排除在外,即我们应该不在map中使用keyword-nil (spec/nilable)对。
如何处理这种情况的最佳方式是什么?
(defn person
[line]
{:person/name (name line) ;; req
:person/height (height line)}) ;; opt, height may return nil
我想出了以下解决方案
给'opt'函数增加额外的arity:keyword和map,这样它们就可以有条件地assoc。通过threading宏来组合一切。仅适用于你“拥有”那些函数。
(defn person
[line]
(->> {:person/name (name line)}
(height line :person/height)))
在调用站点进行检查并assoc some。我觉得 really ugly,想象一下多个选项 - 如何避免嵌套if-let?
(defn person
[line]
(let [ret {:person/name (name line)}]
(if-let [height (height line)]
(assoc ret :person/height height)
ret)))