请参阅
https://groups.google.com/forum/#!topic/clojure/3nMn6TiBGOg, 该链接尚未收到任何回复。
prefers(x,y) 递归调用 parents.invoke() 来访问祖先。
这会遍历全球层次结构中的父类,而不是多方法的层次结构。
这是预期的行为吗?为什么会这样呢?
基于假设,prefer-method 对于局部和全局层次结构应该表现相同,以下是对此的两个单元测试。
MultiFn-prefers-with-local-hierarchy 因为 "多个方法" IllegalArgumentException 失败。
MultiFn-prefers-with-global-hierarchy 成功。
(test/deftest MultiFn-prefers-with-local-hierarchy
(def local-hierarchy
(let [h (make-hierarchy)
h (derive h ::c0 ::b0)
h (derive h ::d0 ::c0)
h (derive h ::d0 ::a0)]
h))
(defmulti local identity :hierarchy #'local-hierarchy)
(defmethod local ::a0 [x] [::a0 x])
(defmethod local ::c0 [x] [::c0 x])
(prefer-method local ::b0 ::a0)
(test/is (= [::c0 ::d0] (local ::d0)))))
(test/deftest MultiFn-prefers-with-global-hierarchy
(derive ::c1 ::b1)
(derive ::d1 ::c1)
(derive ::d1 ::a1)
(defmulti global identity)
(defmethod global ::a1 [x] [::a1 x])
(defmethod global ::c1 [x] [::c1 x])
(prefer-method global ::b1 ::a1)
(test/is (= [::c1 ::d1] (global ::d1))))
如果这确实是错误的,修复将非常简单。一旦确认这是一个真实的问题,我就会提交一个补丁。