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

欢迎!请查看 关于 页面以了解更多关于这是如何工作的信息。

+1
Clojure
clojure.core/get 的实现如果其参数不是一个关联集合,则返回 nil。

这种行为可能会掩盖常见的编程错误,例如


(def a (atom {:a 1 :b 2}))

(:foo a)   ; 忘记 deref a
;;=> nil


在对既不是 nil 也不是关联集合的东西调用 get 几乎肯定是一个错误,并且应该通过异常来表示。

CLJ-932 被接受为对 clojure.core/contains? 的类似增强。

*补丁:* 0003-CLJ-1107-Throw-exception-for-get-on-unsupported-type.patch

*方法:* 在 RT.getFrom 中使用 IllegalArgumentException 作为最后退出的情况,而不是返回 nil。

*另请参阅:* CLJ-969

11 个答案

+2

评论由:richhickey 提出

这将是一个破坏性的更改

+1

即使clojure.core/get的初始设计很令人困惑/错误,现在改也已经太晚了。这个改变不值得。会导致太多程序/库崩溃。
我们现在能做的最好的事是创建一个带有这种新行为的new clojure.core/get2 或 clojure.core/get2/my-lib。

此外,我无法断言这个get2比我们的get有更好的/正确的行为。这只是get的另一套规则。当你提出这一新的规则集时,你能保证在另一天,不会有其他人出现并提出另一套针对get的新规则吗?也许是一个get3?你如何知道何时停止呢?

0

评论人:jafingerhut

2013年5月24日创建的补丁clj-1107-throw-on-get-for-unsupported-types-patch-v2.txt与2012年11月13日创建的0001-CLJ-1107-Throw-exception-for-get-called-on-unsupport.patch相同,除了它可以干净地应用于最新的master。最近对CLJ-1099的提交将测试中的许多IllegalArgumentException更改为Throwable,而这个更新的补丁中就只有这一点改变了。

0

评论人:jafingerhut

2014年1月23日应用于最新的Clojure master的补丁clj-1107-throw-on-get-for-unsupported-types-patch-v2.txt在2014年1月30日之后对Clojure进行的提交中不再干净地应用。我没有检查更新这个补丁可能有多难或有多容易。

0

评论人:stuart.sierra

创建了一个新的补丁0003-CLJ-1107-Throw-exception-for-get-on-unsupported-type.patch,它来自于5cc167a的master版本。

0

评论人:jafingerhut

2014年3月26日创建的补丁clj-1107-throw-on-unsupported-get-v4.patch与Stuart Sierra的0003-CLJ-1107-Throw-exception-for-get-on-unsupported-type.patch相同,并保留了其作者。唯一的不同之处在于diff上下文中所需的一行,以便它能够干净地应用于最新的master。

0
_评论人:stuart.sierra_|

可以说,CLJ-932({{contains?}})也将一些已经错误的事情引入了“故障”。

这次的更改比CLJ-932更具侵入性,但我认为它更有可能暴露隐藏的bug,而不是破坏故意的行为。
0
_评论者:alex+import_

使用"({:a 1}, :a)"和一个安全的替换是否更符合习惯?例如,你可以在代码库中将(get "替换为"("以查找bug吗?我仍在学习这门语言,而且年纪也不小了,所以我无法可靠地记住参数的顺序。因此,我发现避免使用(get)与地图更简单。没有它,我可以把地图放在第一位或第二位。
0

评论者:alexmiller

现在这可能是通过“get”的规范来完成的。

0
参考:[链接](https://clojure.atlassian.net/browse/CLJ-1107)(由stuart.sierra报告)
-1

我本以为(get m k)等价于(val (find m k)),但当我发现当m非关联时情况并非如此,这让我非常惊讶。

当m非关联时,find会抛出异常,但get仅返回nil。

我认为,如果第一个参数非关联,get也应该抛出异常。
在非关联参数上返回nil只会掩盖bug,我想不出任何有效用例。

...