2

在关于多方法的clojure.org 文档中,它指出:

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输入检查或错误处理的最终实现。是否有更惯用的方式来获得验证、错误处理和干净的语法?

4

1 回答 1

5

这不是“路由到错误处理方法”的意思。建议的技术更像这样:

(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))

错误不是来自调度函数本身:而是调度函数找到错误的输入值,并将它们发送到专用的错误处理程序,以便其他方法知道它们将始终获得有效输入。

于 2016-02-19T21:04:48.030 回答