请在 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-在-RT.getFrom-上抛出异常-对于-get-在非支持类型上.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中没有可以再应用此补丁。我没有检查更新此补丁可能有多难或有多容易。

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中对一行diff上下文的要求,以便它可以应用到最新的master版本。

0
_评论者:stuart.sierra_

可以说CLJ-932 ({{contains?}}) 也一样,它“破坏”了一些已经损坏的东西。

这个改动比CLJ-932更加激进,但我认为它更有可能暴露隐藏的缺陷,而不是破坏有意的功能。
0
评论由:alex+import_ 提供

使用 "({:a 1}, :a)" 和一个安全的替换启动是否更符合习惯?例如,您可以在代码库中将 "(get" 大量替换为 "(",以找到错误吗?我仍在学习这门语言,而且不再年轻,无法可靠地记住参数顺序。所以,我发现最好是避免使用 (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 只会掩盖错误,我想不出任何有效的用例。

...