【问题标题】:fnil-like function in Clojure for defining outputClojure 中用于定义输出的类似 fnil 的函数
【发布时间】:2018-01-16 21:40:39
【问题描述】:

在 Clojure 中,fnil 函数可用于包装另一个函数:如果被包装函数的参数是 nil,则包装器会将其更改为其他值。

例如((fnil * 0) nil) ; returns 0 但是 (* nil 0) 会抛出 NPE。

我要问的是是否有类似的内置函数可以修改输出,以防输入为nil。 (换句话说,它甚至不调用包装函数,而是返回默认值。)

也就是说,有没有等价于下面的内置函数?

(defn ifnil [fun default]
      (fn [& args]
          (if (some nil? args) default (apply fun args))))


; ((ifnil * nil) 1 2 3) ; returns 6
; ((ifnil * nil) 1 nil 3) ; returns nil

注意:一如既往,“不,没有这样的功能”也是一个有效的答案(我怀疑,顺便说一句。)

【问题讨论】:

  • 我没见过。
  • 你的问题很好,但你的例子很糟糕:(* nil) 返回nil,而不是抛出异常。将x 乘以无因数只会返回x,而无需验证x 是否为数字。
  • @amalloy:谢谢,你说得对,我的意思是(* nil 0)(实际上,(* nil) 只是返回nil。我会相应地编辑问题。

标签: clojure null


【解决方案1】:

据我所知,没有这样的功能。您的实现看起来不错,所以为什么不在您的代码中使用它。

这里可以改进的是函数的更好名称:ifnil 可能会让你的队友或支持你的代码的人有点困惑。

另外,你说in case the input is nil。但是在您的代码中,您检查至少一个参数是nil。这略有不同。

还有一件事,就我个人而言,我不喜欢默默地默认默认值。也许,您最好手动或使用模式/规范验证输入数据并写入日志。因为fnil 主要用于带有update/update-in 的不存在的键。但你的函数往往是一个验证者。

【讨论】:

  • 我的用例不是验证器,而是将两个矩阵相乘,其中一些元素可能会丢失(因此nil)。
猜你喜欢
  • 1970-01-01
  • 2011-11-09
  • 2020-05-18
  • 2014-06-14
  • 2021-11-12
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多