在Brave和True的Clojure中,第8章提出了一个名为if-valid
的函数(然后被拒绝),以抽象出验证检查的重复部分:
(defn if-valid
[record validations success-code failure-code]
(let [errors (validate record validations)]
(if (empty? errors)
success-code
failure-code)))
作者解释说,上述状态下的功能不会以success-code
工作,failure-code
会在每次if-valid
来电时对其进行评估。我的理解是,if
函数的测试将返回true或false,并指示成功或失败代码是否运行。有人可以解释每个if
电话会如何评估if-valid
的其他部分和其他部分吗?
答案 0 :(得分:3)
假设此函数使用如下:
(if-valid my-data validators
(println "Data accepted")
(throw (Exception. "Bad data :(")))
这不好,因为必须先评估函数参数,然后才能将它们传递给函数。因此,在此函数有机会运行验证之前,每次都会执行首次打印“数据已接受”然后抛出异常的副作用。