我想提供一个可以被覆盖的默认值。我知道可以使用三元运算符,例如:
(def foo (if (not (nil? bar)) bar baz))
但是在Clojure中,肯定有更符合习惯的方式来表达“如果bar为nil,则使用baz”。
有什么建议吗?
除非bar
是nil
或false
,否则将其分配给baz
。
(def foo (or bar baz))
编辑
如果你想要精确地检查 nil
,你可以稍微优化你的原始代码,像这样:
(def foo (if (nil? bar) baz bar))
我认为,这是最短的可能方式,虽然不是惯用语。
:or
默认值的map上使用解构。m
的函数,预期map具有:a
、:b
和:c
键,但如果未提供:b
和/或:c
,则将从:or
子句中获取默认值。(defn foo [m]
(let [{:keys [a b c], :or {b 100 c 200}} m]
(println "a:" a)
(println "b:" b)
(println "c:" c)))
user> (foo {:a 1 :b 2})
a: 1 ; no default, use supplied value
b: 2 ; value supplied, default ignored
c: 200 ; no value supplied, use default from :or
nil
fnil
也是一个选项:
user> (def default-to (partial fnil identity))
#'user/default-to
user> (let [bar :foo
baz :default]
((default-to baz) bar))
:foo
user> (let [bar nil
baz :default]
((default-to baz) bar))
:default
nil
和false
的习语。 - Josh Gloverbar
和baz
的位置,像这样(if (nil? bar) baz bar))
,你就可以摆脱not
,而且它几乎不会变得更短。 - bereal