2024年Clojure调查问卷中分享您的想法!

欢迎!请查看关于页面以了解更多关于此网站的信息。

0
错误

关键字函数应该在错误输入时抛出异常,而不是返回nil。

user=> (keyword 5) nil user=> (keyword []) nil

原因:关键字函数被定义为一个具有关键字、符号和字符串情况的cond。没有:else,因此所有其他情况都返回nil。

提议:在关键字中添加一个:else分支,并抛出异常。

Patch

5 个答案

0

评论者:ericnormand

关键字函数应该在错误参数类型的情况下抛出IllegalArgumentException,而不是返回nil。为了保持一致性,如果两个参数不是字符串,则双参数情况应该抛出IllegalArgumentException。

find-keyword函数应该类似地操作以保持相同的签名。

当前行为

user=> (keyword 5)
nil
user=> (keyword (link: ))
nil
user=> (keyword 1 1)
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String

原因:关键字函数被定义为具有关键字、符号和字符串情况的cond。没有:else,因此所有其他情况都返回nil。对于find-keyword也是这样,它应该以相同的方式操作。双参数情况会抛出异常,但消息不是很有助于理解。

提议:我为cond添加了一个:else分支,抛出一个带有指示可接受类型并打印实际参数的消息的IllegalArgumentException。我也对find-keyword做了同样的更改。还有一些简单的测试。

Patch: keyword-1341-2014-02-12.patch

注意:此更改不会检查所有不良输入,只检查类型。例如,仍然可以传入具有“非法”关键字字符的字符串。

0

评论人:alexmiller

嗨Eric,感谢你提供的代码补丁!关于将一个参数修改为两个参数看起来不错。

关于两个参数的修改,我有一些担忧——我担心我们将新的检查添加到一个相当热的代码路径中(关键字创建)。两个参数的路径不会静默失败,你会得到一个ClassCastException,因此我认为在这里添加这些检查不值得。在单参数的情况下,您已经通过了else分支,所以没有额外的成本。

0

评论者:ericnormand

我明白了。我会移除两个参数的情况。

0

评论者:ericnormand

关键字函数应该在输入错误时抛出IllegalArgumentException,而不是返回nil。两个参数的情况已经抛出了异常。

find-keyword函数应该类似地操作以保持相同的签名。

当前行为

user=> (keyword 5)
nil
user=> (keyword (link: ))
nil
user=> (keyword 1 1)
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String

原因:关键字函数被定义为cond,具有针对关键字、符号和字符串的case。没有:else,所以所有其他情况都返回nil。find-keyword也是一样,应该以相同的方式执行。

提议:我为cond添加了一个:else分支,抛出一个带有指示可接受类型并打印实际参数的消息的IllegalArgumentException。我也对find-keyword做了同样的更改。还有一些简单的测试。

替代方案:已经考虑了在两个参数的情况下添加检查,但担心由于它已抛出异常,添加额外的开销不值得。在单参数的情况下没有增加显著的开销,因为它只会影响错误输入。

补丁:keyword-1341-2014-02-12.2.patch

注意:此更改不会检查所有不良输入,只检查类型。例如,仍然可以传入具有“非法”关键字字符的字符串。

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