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

欢迎!有关此网站如何运作的更多信息,请参阅 关于页面

+1
错误

如果您调用了一个协议函数,但传递了错误的参数数量(比如忘记了一个参数),当前会显示一条消息说“在协议 ... 中未找到对应于函数 ... 的单个方法 ...”。有疑问的代码从 Reflector 中获取匹配的方法,并在匹配数量不等于 1 时创建此消息。

这里实际上有两种情况:
- 匹配数 == 0 - 这通常是由于拼写错误而频繁发生的
- 匹配数 > 1 - 这可能不太经常发生

我建议将 == 0 的情况改为在开头使用稍微不同的文本,并在其中提供有关预期参数数量的提示

"未找到具有参数数量 ... 的接口 ... 中的方法 ... 的协议函数 ..."。

匹配数 >1 的情况应进行类似更改:“找到多个方法:接口 ... 中的方法 ... 具有参数数量 ... 协议 ... 中的函数 ...”。

修复已附加。我使用了巢状 if/else 的情况下可能更好的性能的情况。我并不确定报告的参数数量是否应该匹配实际的 Java 方法参数数量或 Clojure 协议函数参数数量(包括目标)。我做了前者。

我没有添加测试,因为我并不确定检查测试中的错误信息是否合适。如果需要,我很乐意添加。

3 答案

0

评论者:cemerick

bq. 我不确定报告的参数数量是否应该匹配实际的 Java 方法参数数量或 Clojure 协议函数参数数量(包括目标)。我做了前者。

我认为它应该是后者。当通过相应函数调用协议方法时,会发出此消息,因此应该与常规函数发出的错误信息保持一致。

对于一些测试也同意。当然有测试用于反射警告等。

仅供参考,如果 Alex 没有空的话,我也愿意承担这项任务。

0

评论人:alexmiller

在许多年后接手这个任务... :)

1) 我认为现在我可能会稍微改变一下控制流,先将正常路径(methods.size() == 1)放在前面,然后在错误情况下加上那个 switch/case 东西

if(methods.size() == 1) { this.onMethod = (java.lang.reflect.Method) methods.get(0); } else if(methods.size() == 0) { ... } else { ... }

2) 编译器的代码应该使用制表符而不是空格。 :)

3) 我希望添加对这两种情况下的错误消息的测试。这些可以放在 clojure.test-clojure.protocols 中。

0
参考:[https://clojure.atlassian.net/browse/CLJ-735](https://clojure.atlassian.net/browse/CLJ-735)(由 alexmiller 报告)
...