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` 你覆盖的 defmulti。但这是一种粗糙且脆弱的解决方案。为什么不衍生这个库并使其配置更正确呢?
...