在clojure.org documentation on multimethods中,它声明:
Clojure multimethods ... can do validation of arguments and route to error-handling methods etc.
然而,我并没有看到很多使用多方法来达到这个目的的例子。在我只需要实现一个方法定义的情况下,使用多方法进行输入验证仍然有意义吗?例如:
(defmulti divide
(fn [a b] (if (zero? b)
(throw (IllegalArgumentException. "Cannot divide by zero"))
:ok)))
(defmethod divide :ok [a b] (quot a b))这样做的好处是,它保持了divide的最终实现对输入检查或错误处理的清晰度。有没有更常用的方法来获得验证、错误处理和干净的语法?
发布于 2016-02-20 05:04:48
这不是“路由到错误处理方法”的意思。建议的技术更像是这样:
(defmulti divide (fn [num denom] denom))
(defmethod divide 0 [num denon]
(throw (IllegalArgumentException. "Cannot divide by zero")))
(defmethod divide :default [a b] (quot a b))错误不是来自分派函数本身:相反,分派函数发现错误的输入值,并将它们发送到专用的错误处理程序,以便其他方法知道它们将始终获得有效输入。
https://stackoverflow.com/questions/35514942
复制相似问题