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

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

+1投票
错误

如果您调用协议函数但传递了错误的arity(例如忘记一个参数),目前显示的消息是“没有在接…中找到单个方法…以替换协议…中的函数…”。问题代码从Reflector获取匹配方法并在此匹配数量不等于1的情况下创建此消息。

实际上有两种情况:
– 匹配 == 0 – 这通常因为拼写错误而频繁发生
– 匹配 > 1 – 这可能不常发生

我提议对于那些== 0的情况,开头应有稍微不同的文字,并在其中包含有关期望arity的提示

"未找到arity…的接口…的方法:…,以替换协议…的函数…".

>1的情况应有类似的变化:"发现多个方法的:…的接口…,以替换协议…的函数…".

补丁已附加。我使用了case,相比嵌套if/else可能会有更好的性能。我不确定报告的arity是否应该匹配实际的Java方法arity还是Clojure协议函数arity(包括目标)。我做了前者。

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

3 个答案

0投票

评论者:cemerick

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

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

也为一些测试加一分。当然会有关于反射警告等的通知。

顺便说一下,如果Alex忙于其他事情,我很乐意承担这项工作。

0投票

评论人:alexmiller

在过了一千年之后拿这个问题…… :)

1) 我想我可能现在会稍微改变一下控制流,将正常的路径(methods.size() == 1)首先,然后是错误情况,而不是那个switch/case stuff

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

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

我想为这两种情况添加错误消息的测试。这些测试可以添加到clojure.test-clojure.protocols。

0投票
参考资料:https://clojure.atlassian.net/browse/CLJ-735 (由alexmiller报告)
...