在Clojure中,fnil函数可用于包装另一个函数:如果包装函数的参数为nil
,则包装器会将其更改为其他函数。
E.g。 ((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
N.B。:一如既往,"不,没有这样的功能"也是一个有效的答案(我怀疑,顺便说一句。)
答案 0 :(得分:1)
据我所知,没有这样的功能。您的实现看起来很好,所以为什么不在代码中使用它。
这里可以改进的是一个更好的功能名称:ifnil
对于你的队友或那些支持你的代码的人来说可能有点混乱。
另外,你说in case the input is nil
。但是在您的代码中,您检查至少一个参数是nil
。这略有不同。
还有一件事,就我个人而言,我不是默默无声地默认的粉丝。也许,您最好手动或使用架构/规范和写日志来验证输入数据。因为fnil
主要用于update
/ update-in
的非现有密钥。但是你的功能往往是一个验证者。