在Clojure中,如果为nil,如何选择值

在Clojure中,如果为nil,如何选择值,clojure,Clojure,在Clojure中,测试nil的惯用方法是什么?如果某个值为nil,则替换一个值 例如,我经常这样做: let [ val (if input-argument input-argument "use default argument")] :但我发现它重复使用“输入参数”两次。只需使用或: (or input-argument "default") Alex建议的“or”确实是重写示例代码的惯用方法,但请注意,它不仅会替换nil值,还会替换false值 如果要保留值false,但放

在Clojure中,测试nil的惯用方法是什么?如果某个值为nil,则替换一个值

例如,我经常这样做:

 let [ val    (if input-argument input-argument "use default argument")]

:但我发现它重复使用“输入参数”两次。

只需使用

(or input-argument "default")
Alex建议的“or”确实是重写示例代码的惯用方法,但请注意,它不仅会替换
nil
值,还会替换
false

如果要保留值
false
,但放弃
nil
,则需要:

(let [val (if (nil? input-argument) "use default argument" input-argument)]
   ...)

如果您只绑定变量以获得正确的值,而不使用它两次,那么还有一种方法可以做到这一点。内核中有一个名为
fnil
的函数

使用要调用的函数和默认参数调用
fnil
。这将返回一个函数,该函数将用您提供的默认值替换nils

你可以根据你想要的做其中一件事。创建一个本地函数

(let [default-fn (fnil fn-you-want-to call "default-argument")]
(default-fn input-argument))
在某些情况下(您总是有相同的默认参数),您可以从代码中转移到逻辑,并将其放在原始函数所在的位置(或者将函数包装到其他库中)

然后在你的代码中,它被简化为

(fn-you-want-to-call-default input-argument)
您可以在这里找到更多信息:

因此,惯用的答案可能是测试false,而不是nil。顺便说一句,由于大多数工作都是在集合上完成的,而不是检查单个值,上面答案的映射版本是:(map#(如果(nil?)“这是nil”%”coll)也许,但OP要求使用惯用的方法来检查
nil
。我无法评论他应该如何围绕他的示例构建未发布的代码。:-)不错的一个:-)。如果让[result input argument]结果为“default”,我会做一些麻烦的事情。我会记住手术室的!请注意,如果输入参数为nil或false,这将给出“默认”值,这可能不是您想要的。这应该是公认的答案,这是一个很好的答案。如果您经常这样做,特别是在输入参数中,那么您可能不知道您可以为函数定义。
(fn-you-want-to-call-default input-argument)