2013-09-05 6 views
5

私は重いjavascriptの背景から来て、clojureを学んでいます。Clojureで現在の値がnilの場合にデフォルト値を割り当てる方法は?

jsで実行できます。

var aVariable; //evaluates as falsy 
var x = aVariable || 'my Default String'; 

どのようにクロージャでこれを行いますか?

現在、私はcompojureからのリクエストマップからヘッダーを読んでいます。 「X-転送-ための」ヘッダが存在しない場合、X-転送-の値がゼロである場合には

(let [x-forwarded-for (get-in request [:headers "x-forwarded-for"])] 
    (println x-forwarded-for) 
) 

。 nilをテストし、x-forwarded-forを別の値に再割り当てする適切な方法は何ですか?

答えて

8

は幸いにもget-in機能has a not-found parameter:一般的に

(let [x-forwarded-for (get-in request [:headers "x-forwarded-for"] 
           "default value")] 
    (println x-forwarded-for)) 

@prismofeverythingが言ったように、あなたはor使用することができます。

+1

実際、フォールバック値を設定するために 'or'を使うことは、私が見たコードでは非常に慣例的です。 – Alex

9

あなたは組み込みのorを使用することができます。

(let [x-forwarded-for (or (get-in request [:headers "x-forwarded-for"]) "my Default String")] 
    (println x-forwarded-for)) 

最初の句がnilであれば、それは第二を使用します。まさにこのユースケースのための

+0

これは慣用的であるとうまく動作しますが、false'のも、それが通って落下するようになります 'として、ブール値の周りに注意してください(それは、ここでの挙動を希望ですかOPの質問から不明だために設計されました)。 – Alex

1

fnilが、これは

user> ((fnil println "hello") nil) 
hello 
nil 
user> ((fnil println "hello") "world") 
world 
nil 
user> ((fnil println "hello") false) 
false 
nil 
+0

これはかなりクールです...もっと特殊化されたケース(関数のカリング用に設計されたユーティリティをすぐに呼び出すようなものです)が実際にこれを使ってカルト化された関数を作成し、特定のレキシカルコンテキストは本当にクールです – jm0

関連する問題