2024 Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面获取更多关于如何使用此功能的信息。

+5
协议

如果一个对象是多个(无关的)接口的实例,每个接口都扩展了协议,那么将随机选择派发的方法。

(defn reproduce []
  (eval 
    (list 'do
          (list 'ns (gensym))
          '(do (definterface A)
               (definterface B)

               (defprotocol P
                 (a [this]))

               (extend-protocol P
                 A
                 (a [this] :a)
                 B
                 (a [this] :b))
               (a (reify A B))))))

(frequencies
  (repeatedly 100 reproduce))
;=> {:b 52, :a 48}

一种解决方案是在选择实现之前按名称对接口进行排序,从而至少消除非确定性。在这种情况下,我们还可以进一步打印警告。

登录:https://clojure.atlassian.net/browse/CLJ-2656

登录注册以回答此问题。

...