如何在Clojure中为当前值为空时分配默认值?

6

我具备丰富的 JavaScript 背景,正在学习 Clojure。

在 JavaScript 中,我们可以做到以下操作;

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重新分配给另一个值?

3个回答

11

您可以使用内置的 or

(let [x-forwarded-for (or (get-in request [:headers "x-forwarded-for"]) "my Default String")]
  (println x-forwarded-for))
如果第一个子句为 nil,则使用第二个子句。

这是惯用法,运行良好,但在布尔值周围要小心,因为 false 也会导致它跳过(从 OP 的问题中无法确定这里是否需要该行为)。 - Alex

7
幸运的是,get-in函数有一个not-found参数,正好可以用于这种情况:
(let [x-forwarded-for (get-in request [:headers "x-forwarded-for"]
                              "default value")]
    (println x-forwarded-for))

通常情况下,你可以像 @prismofeverything 所说的那样使用 or

1
实际上,在我看过的代码中,使用“or”来设置回退值非常惯用。 - Alex

3

fnil的设计就是为了这个目的

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

这非常酷......更多的是一种专门的情况(就像立即调用更为设计柯里化函数的实用程序),但实际上可以使用它在特定的词法上下文中创建具有默认值的柯里化函数的广泛可能性真的很酷。 - jm0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接