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

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

0
多方法

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

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

最后,在 core 命名空间中,我导入 ab,观察解解析是由导入命名空间的顺序决定的。

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

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

最好了,
大卫

1 答案

+1

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

另一方面,当分派函数返回一个与多个方法分派值相关的值时,会进行一些幕后操作来分派多方法调用。在这种情况下,请查看 prefer-method

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

假设某个库在派发值 `a` 上定义了一个方法,而我们的自定义代码库覆盖了相同派发值的方法,那么将会先执行哪个?
这真是一个令人遗憾的情况!也许在您确定库已加载所有将要加载的代码后,您可以 `eval` 覆盖的 defmulti。但这是一种粗糙且易碎的解决方案。是否可以通过分叉库使其能够正确配置?
...