2024 年 Clojure 状态调查!分享您的观点。

欢迎!请查看 关于页面 以了解更多关于其工作方式的细节。

0
多方法

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

为了回答这个问题,我通过创建四个文件(core.cljs,a.clj,b.clj,interface.clj [定义 defmulti 的地方])进行实验,在 a 和 b 命名空间中实现了具有相同分派值的一些方法。

最后在 core 命名空间中,我要求使用 a 和 b,并观察到解析是根据导入命名空间的顺序来执行的。

然而,在一个更大的项目中,顺序没有产生影响:我在一个库中覆盖了多方法,我怀疑解析是根据类路径中的文件夹进行的。

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

最美好的祝愿,
David

1 个答案

+1

每个 "defmulti" 至多知道一个具有任何特定分派值的方法。如果有第二个 "defmethod",它将替换第一个。这是基于 REPL 的开发的基础。

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

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

比如说,一个库依赖定义了一个针对调度值“a”的方法,而我们的自定义代码库覆盖了相同调度值的方法,那么哪一个会被优先选择呢?
这种情况实在令人遗憾!也许你可以在确信库已经加载了所有将要加载的代码后,对你的覆盖定义使用`eval`。但这只是一个粗糙且脆弱的解决方案。你能否将库分叉并使其可正确配置?
...