オーバーライド可能なデフォルト値を提供したいと考えています。次のように、三項を使用できることを知っています。
(def foo (if (not (nil? bar)) bar baz))
しかし、Clojure には、「bar を使用するか、bar が nil の場合は baz を使用する」というより慣用的な方法があることは確かです。
助言がありますか?
またはでbar
ない限り、これは代入します。nil
false
baz
(def foo (or bar baz))
編集
正確にチェックしたい場合はnil
、次のように元のコードをわずかに最適化できます。
(def foo (if (nil? bar) baz bar))
慣用的ではありませんが、これが最短の方法だと思います。
あなたの質問は特に複数の変数について尋ねませんが、複数の変数に対してこのデフォルトを設定したい場合、慣用的な方法は:or
デフォルトでマップ上で破壊を使用することです。
たとえば、マップ引数をとるこの関数を使用しm
ます。期待されるマップには、、、&のキーがありますが: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