在Clojure中如何选择一个值,如果为零

Zub*_*air 21 clojure

在Clojure中,测试nil的惯用方法是什么,如果有什么东西是零,那么替换一个值?

例如,我做了很多:

 let [ val    (if input-argument input-argument "use default argument")]
Run Code Online (Sandbox Code Playgroud)

:但我觉得重复两次必须使用"输入参数".

Ale*_*Ott 77

只需使用:

(or input-argument "default")
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果input-argument为nil或false,这将给出"default"值,这可能不是您想要的. (4认同)

san*_*inc 19

Alex对"或"的建议确实是重写示例代码的惯用方法,但请注意,它不仅会替换nil值,还会替换那些值false.

如果您想保留价值false但要丢弃nil,则需要:

(let [val (if (nil? input-argument) "use default argument" input-argument)]
   ...)
Run Code Online (Sandbox Code Playgroud)

  • 或许,但是OP要求用惯用的方法来检查"nil".我不能评论他应该如何构建围绕他的例子的未示出的代码.:-) (3认同)

nic*_*kik 7

如果你只绑定变量来获得正确的值而不是两次使用它,你可以采用另一种方法.核心中有一个函数叫做fnil.

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

您可以根据自己的需要做其中一件事.创建一个本地函数.

(let [default-fn (fnil fn-you-want-to call "default-argument")]
(default-fn input-argument))
Run Code Online (Sandbox Code Playgroud)

在某些情况下(你总是有相同的默认参数),你可以移动到逻辑来从代码中执行此操作并将其放在原始函数所在的位置(或将函数包装在其他库中).

(defn fn-you-want-to-call [arg] ....)
(def fn-you-want-to-call-default (fnil fn-you-want-to-call "default-argument"))
Run Code Online (Sandbox Code Playgroud)

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

(fn-you-want-to-call-default input-argument)
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到更多:http: //clojuredocs.org/clojure_core/clojure.core/fnil