18

オーバーライド可能なデフォルト値を提供したいと考えています。次のように、三項を使用できることを知っています。

(def foo (if (not (nil? bar)) bar baz))

しかし、Clojure には、「bar を使用するか、bar が nil の場合は baz を使用する」というより慣用的な方法があることは確かです。

助言がありますか?

4

3 に答える 3

29

またはでbarない限り、これは代入します。nilfalsebaz

(def foo (or bar baz))

編集

正確にチェックしたい場合はnil、次のように元のコードをわずかに最適化できます。

(def foo (if (nil? bar) baz bar))

慣用的ではありませんが、これが最短の方法だと思います。

于 2012-04-14T08:25:29.690 に答える
4

あなたの質問は特に複数の変数について尋ねませんが、複数の変数に対してこのデフォルトを設定したい場合、慣用的な方法は: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
于 2012-04-14T20:18:38.293 に答える
2

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
于 2012-04-16T21:39:23.633 に答える