2024年Clojure调查 中分享您的观点!

欢迎!请参阅关于页面,获取有关如何使用该网站的更多信息。

+1
错误

如果您调用了一个协议函数,但传递了错误的参数数量(例如,忘记了一个参数),您目前会看到一个消息:“未找到接口...的协议...函数...的单个方法...”。问题代码从Reflector中获取匹配的方法,如果匹配的数量不等于1,就创建这个消息。

这里实际上有两种情况:
- 匹配等于0 - 这通常由于拼写错误而发生。
- 匹配数大于1 - 这个情况可能不太常见。

我建议对于等于0的情况,在最开始应该有略微不同的文本,并在其中提供有关预期参数数量的提示。

"未找到接口...的参数...数量的方法:...,用于协议...函数..."。

对于匹配数大于1的情况,也应该进行类似的更改:“找到多个:接口...的参数...数量的方法:...,用于协议...函数...”。

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

我没有添加测试,因为我不确定是否应该在测试中检查错误消息。如果需要,我愿意添加。

3 个答案

0

评论者:cemerick

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

我认为应该是后者。当通过对应的函数调用协议方法时,将发出消息,因此它应该与普通函数发出的错误一致。

对一些测试我也投赞成票。当然有关于反射警告之类的测试。

FWIW,如果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报告)
...