【问题标题】:How to assign a default value if current value is nil in Clojure?如果 Clojure 中的当前值为 nil,如何分配默认值?
【发布时间】:2013-09-05 18:27:09
【问题描述】:

我来自 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 重新分配给另一个值的正确方法是什么?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    你可以使用内置的or

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

    如果第一个子句是nil,它将使用第二个。

    【讨论】:

    • 这是惯用的并且效果很好,但要小心布尔值,因为false 也会导致它失败(从 OP 的问题中不清楚这是否是此处所需的行为)。
    【解决方案2】:

    幸运的是,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

    【讨论】:

    • 实际上,在我见过的代码中,使用or 设置回退值是非常惯用的。
    【解决方案3】:

    fnil 就是为此而设计的

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

    【讨论】:

    • 这很酷……更像是一个专门的案例(就像立即调用一个更专为函数柯里化设计的实用程序),但实际使用它来创建柯里化函数的可能性更大使用仅适用于特定词汇上下文的默认值真的很酷
    猜你喜欢
    • 2018-01-04
    • 2012-11-25
    • 2017-12-05
    • 2017-03-12
    • 2011-08-07
    • 2022-01-24
    • 2023-03-30
    • 2022-01-24
    • 2017-09-13
    相关资源
    最近更新 更多