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

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

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

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


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

(:foo a)   ; 忘记解引用 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 的初始设计可能令人困惑/不正确,现在改也来不及了。这种改变不值得。将会破坏太多程序/库。
我们现在能做得更好的是创建一个具有这种新行为的 clojure.core/get2my-lib.core/get

此外,我无法断言这个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

clj-1107-throw-on-get-for-unsupported-types-patch-v2.txt补丁作为2014年1月23日的Clojure master版本干净地应用,但之后在2014年1月30日之间提交到Clojure的commit已不再这样做。我还没有检查更新此补丁可能有多难或有多容易。

0

评论人: stuart.sierra

根据5cc167a版本的master创建的新补丁0003-CLJ-1107-Throw-exception-for-get-on-unsupported-type.patch。

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
by
_评论者:alex+import_

是否更恰当使用 "({:a 1}, :a)" 和一个安全性高的替换?例如,能否批量将代码库中的 "(get " 替换为 "(", 以便找到bug?我仍在学习这门语言,且年龄已不再年轻,无法可靠地记住参数顺序。因此,为了避免使用 (get) 和 maps,我发现更容易。没有它,我可以将 map 放在第一位或第二位。
0
by

评论者:alexmiller

可以推测,这也可以通过 "get" 的规范来完成。

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

我曾经认为 (get m k) 等同于 (val (find m k)),但当我发现当 m 不是关联性的情况下并非如此,这让我感到非常惊讶。

当 m 不是关联性时,find 会抛出异常,但 get 只返回 nil。

我认为 get 也应在第一个参数不是关联性时抛出异常。
对于非关联性参数返回 nil 只会掩盖 bug,我想不出任何有效的用例。

...