2024 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
by

评论人:alexmiller

欢迎补丁

by
嗨亚历克斯:

我几年前在https://clojure.atlassian.net/browse/CLJ-2234提交了一个补丁,我还需要做什么来获得考虑?我很乐意做出任何您希望的改变。
by
我们根据投票数量(部分)确定优先级,所以现在这个(问题)在列表中排得相当后。
0
by

评论人:palisades-lakes

我不确定preferMethod的变化。
我已经将resetCache移到开始部分,这样
perfers()就可以在当前的层次结构状态下调用。由于我们处于写入锁中,我认为不需要再次调用它。

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