在这个特定情况下,我可能会将 search
的 nil
值视为在 filter
调用中的“始终匹配”。
(filter (fn [comment] (or (nil? search)
(s/includes? (s/upper-case (:thread comment))
(s/upper-case search))))
comments)
然后可以直接调用该函数的 0 个参数版本,并用 nil
调用 1 个参数版本。
(defn get-threads
"Get all urls threads"
([] (get-threads nil))
([search]
(let [comments ...]
(filter ... comments))))
另一种选择是使用 cond->>
(cond->> (distinct (map (fn [comment] ...) @db))
search
(filter (fn [comment] (s/includes? ...)))
这样可以只在 search
非空时将注释传递给 filter
调用,否则将返回所有未过滤的注释。
通常情况下,如果由于可选参数导致存在多种参数类型,我会为这些可选参数选择一个“空”值,并让较低参数类型的函数调用整个参数类型的函数,同时传递这些“空”值(例如零、nil
、空列表等)。然后完整的参数类型的函数将根据需要条件性地处理这些“空”值。