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

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

+1 点赞
错误

如果您调用协议函数时传入了错误的函数参数(例如忘记一个参数),您现在会看到一个消息说“没有找到接口 ... 中的单个方法 ... 的函数 ... 的协议 ...”。在这个情况下,相关的代码从 Reflector 中获取匹配的方法,如果匹配的数量不等于 1,则创建此消息。

实际上有两种情况
- 匹配 == 0 - 这通常是由于拼写错误导致的
- 匹配 > 1 - 假设这种情况不太常见

我建议 == 0 的情况应该开头略有不同并在其中提供有关预期的参数数量的提示

"没有找到参数 ... 的接口 ... 的方法 ... 的协议 ... 函数 ..."。

>1 的情况应该有类似的变化:"找到多个方法:... 的接口 ... 的参数 ... 的协议 ... 函数 ..."。

补丁已附上。我使用了 cases,这可能比嵌套的 if/else 更好。我不确定是否应该报告的参数数量应与实际的 Java 方法参数数量匹配,还是与 Clojure 协议函数参数数量(包括目标)匹配。我选择了前者。

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

3 答案

0 点赞

评论者:cemerick

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

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

对于一些测试,也增加+1。当然有关于反射警告等测试。

就我所知,如果亚历克斯(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(由alexmiller报告)
...