2024 Year of Clojure调查! 中分享您的想法。

欢迎!请参阅关于页面以了解更多有关该工作的详细信息。

+2
多态方法
已关闭
查看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))))

如果这确实有问题,修复会相当简单。一旦确认这是一个真正的问题,我会提交一个补丁。
以以下备注关闭: 在 1.11.0-alpha4 中发布

3 个回答

0

评论者:alexmiller

欢迎补丁

你好,Alex,

我几年前提交了一个补丁来处理这个问题,见https://clojure.atlassian.net/browse/CLJ-2234, 我还需要做什么来让这个补丁被考虑吗?我会做出任何你们想要的更改。
我们根据这里的投票数量(部分)来确定优先级,所以这个目前排在列表的底部。
0

评论者:palisades-lakes

我对preferMethod的更改不太确定。
我将resetCache移到了开始位置,这样
perfers()就能用当前层次结构的状态调用了。由于我们处于写锁中,我认为没有必要再次调用它。

0
参考: https://clojure.atlassian.net/browse/CLJ-2234 (由palisades-lakes报告)
...