考虑一个层次结构
(derive ::lchild ::parent)
(derive ::rchild ::parent)
(derive ::gchild ::lchild)
(derive ::gchild ::rchild)
(derive ::ggchild ::gchild)
和一个多方法
(defmethod mm ::parent [x] nil)
(defmethod mm ::lchild [x] nil)
(defmethod mm ::rchild [x] nil)
(defmethod mm ::gchild [x] nil)
调用 (mm ::ggchild)
应该调用为 ::gchild
定义的函数,但它失败了,而是
user=> (mm ::ggchild)
Execution error (IllegalArgumentException) at user/eval224 (REPL:1).
Multiple methods in multimethod 'mm' match dispatch value: :user/ggchild -> :user/lchild and :user/rchild, and neither is preferred
然而,这种失败不是一致的。在 MultiFn::findAndCacheBestMethod
中循环的方法顺序取决于分配值的哈希值(在这种情况下为关键词)。因此,给分配值不同的名称可能给人一种正常工作的印象。例如,将 '7' 添加到每个关键词 "工作"
user=> (mm7 ::ggchild7)
nil
可能的解决方案是将查找 bestEntry
和验证分成 2 个单独的循环。