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

欢迎!请参阅关于 页面以获取更多有关如何工作的一些信息。

0
多态方法

当两个多态方法具有相同的分派值时,解决方法是什么?

为了回答这个问题,我尝试创建了四个文件(core.cljs、a.clj、b.clj、interface.clj [其中定义了 `defmulti`]),在 a 和 b 名称空间中实现了具有相同分派值的方法。

最后,在 core 名称空间中,我导入了 ab,并观察到解析是由名称空间的导入顺序给出的。

然而,在更大的项目中,顺序没有影响:我在库中覆盖了一个多态方法,我怀疑解析是与类路径中的文件夹相关。

有人可以证实或否定我的假设吗?

最好的祝愿,
David

1 答案

+1

每个 "defmulti" 仅知道与任何特定分派值相关的一个方法。如果出现第二个 "defmethod",它将替换第一个。这是基于 REPL 的开发的基础。

另一方面,在分派函数返回与一个以上的方法分派值相关(通过相关的层次结构)的值时调用多态方法的情况中,幕后还有一些有趣的工作。在这种情况下,请参阅 prefer-method

在这种情况下,我们如何知道多方法定义的顺序呢?

假设一个库依赖定义了一个用于调度值 `a` 的方法,并且我们的自定义代码库覆盖了相同调度值的方法,哪一个将优先?
这是一个令人遗憾的情况!也许你可以在确认库已经加载了所有它将加载的代码后,对你的覆盖定义进行 `eval`。但这是一个简陋且脆弱的解决方案。是否可以从库中分叉并使其适当可配置?
...