【问题标题】:In Clojure how to choose a value if nil在 Clojure 中,如果为 nil,如何选择一个值
【发布时间】:2011-08-07 09:15:15
【问题描述】:

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

例如我经常这样做:

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

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

【问题讨论】:

  • 如果你经常这样做,尤其是输入参数,那么你可能不知道你可以为函数定义multiple signatures

标签: clojure


【解决方案1】:

只需使用

(or input-argument "default")

【讨论】:

  • 不错的一个:-)。我会做一些麻烦的事情(if-let [result input-argument] result "default")。我会记住 or!
  • 请注意,如果 input-argument 为 nil 或 false,这将给出“默认”值,这可能不是您想要的。
  • 这应该是公认的答案,很好
【解决方案2】:

Alex 对“或”的建议确实是重写示例代码的惯用方式,但请注意,它不会替换 nil 值,还可以替换 false 值。

如果你想保留false的值但丢弃nil,你需要:

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

【讨论】:

  • 因此,惯用的答案可能是测试 false,而不是 nil。顺便说一句,由于大多数工作倾向于在集合上完成,而不是检查单个值,因此上述答案的地图版本是:(map #(if (nil? %) "this was nil" %) coll)
  • 也许,但 OP 要求使用惯用的方式来检查 nil。我无法评论他应该如何构建围绕他的示例的未显示代码。 :-)
【解决方案3】:

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

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

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

(let [default-fn (fnil fn-you-want-to call "default-argument")]
(default-fn input-argument))

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

(defn fn-you-want-to-call [arg] ....)
(def fn-you-want-to-call-default (fnil fn-you-want-to-call "default-argument"))

然后在你的代码中它减少到只是

(fn-you-want-to-call-default input-argument)

您可以在此处找到更多信息: http://clojuredocs.org/clojure_core/clojure.core/fnil

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2012-11-25
    相关资源
    最近更新 更多