Clojure 2024 年调查问卷 中分享您的想法!

欢迎!请参阅 关于 页面以了解更多有关如何操作的信息。

+5
Clojure

考虑一个层次结构

(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 个单独的循环。

登录注册 以回答此问题。

...