6

我来自沉重的 javascript 背景和学习 clojure。

在js中我们可以做到;

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

你如何在clojure中做到这一点?

目前,我正在从来自 compojure 的请求映射中读取标头。

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

在“x-forwarded-for”标头不存在的情况下,x-forwarded-for 值为 nil。测试 nil 然后将 x-forwarded-for 重新分配给另一个值的正确方法是什么?

4

3 回答 3

11

You can use the built-in or:

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

If the first clause is nil, it will use the second.

于 2013-09-05T18:30:07.870 回答
7

幸运的是,该get-in函数有一个not-found完全适合这个用例的参数:

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

一般来说,你可以or像@prismofeverything 所说的那样使用。

于 2013-09-05T18:33:15.030 回答
3

fnil 就是为此而设计的

user> ((fnil println "hello") nil)
hello
nil
user> ((fnil println "hello") "world")
world
nil
user> ((fnil println "hello") false)
false
nil
于 2013-09-05T21:03:38.090 回答