【问题标题】:Understanding multimethods dispatching了解多方法调度
【发布时间】:2014-07-05 16:10:36
【问题描述】:

我可以理解这是如何工作的:

(defmulti area :Shape)
(defmethod area :B [x] (println "Rect"))
(defmethod area :C [x] (println "Circle"))
(defmethod area :default [x] (do (println "Unknown") (:Shape x)))
(area {:Shape :B})
=> Rect
nil
(area {:Shape :Bb})
=> Unknown
:Bb

但只要将:Shape 更改为:Shap,我就无法理解它是如何发送的:

(defmulti area :Shap)
(defmethod area :B [x] (println "Rect"))
(defmethod area :C [x] (println "Circle"))
(defmethod area :default [x] (do (println "Unknown") (:Shap x)))
(area {:Shap :B})
=> Unknown
:B
(area {:Shap :C})
=> Unknown
:C

Eclipse 上的 Clojure 1.5.1,带有逆时针插件

【问题讨论】:

  • 我在 lein 的 REPL 中尝试过它并且它有效,一定是 CounterClockwise 的问题(我敢打赌,用户命名空间在两个测试之间都没有重新初始化)。
  • 顺便说一句,您的第一个示例中一定有一个错字:方法定义中的 ::B 关键字不应命名空间或调用示例中的 :B 应该命名空间。

标签: clojure multimethod


【解决方案1】:

多方法不喜欢用新的调度函数重新定义。这是一个相当有争议的功能,但事情就是这样。为了改变多方法的调度函数,你必须首先将它定义为不是多方法的东西(例如,nil)。

(defmulti area :Shape)

(def area nil)

(defmulti area :Shap)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    相关资源
    最近更新 更多