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

欢迎!请参阅关于页面以了解更多关于此如何工作的信息。

0
错误

关键词函数应该在输入不当时抛出异常而不是返回 nil。

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

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

建议:在关键词中添加一个 :else 分支并抛出异常。

补丁

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 做了同样的修改。还有一些简单的测试。

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

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

0

评论者:alexmiller

嘿Eric,感谢你的补丁!1个参数的改变看起来不错。

至于2个参数的改变,我有些担忧 - 我担心我们在一个非常热门的代码路径(关键字创建)中添加了新的检查。2个参数的路径不会静默失败,你会得到ClassCastException,因此我认为在这里添加这些检查是不值得的。在1个参数的情况下,你已经在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,以应对关键字、符号和字符串的情况。没有: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报告)
...