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 的另一套新规则吗? maybe a 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 已干净地应用到最新的Clojure master中,但自那时起至2014年1月30日所做的提交中已经不能再这样做。我尚未检查更新此补丁可能有多难或有多简单。

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)"和一个安全的替换来进行操作是否能更符合习惯?例如,能否在代码库中将所有的"(get"替换为"(",以找到错误?我还在学习这门语言,而且已经不年轻了,无法可靠地记住参数顺序。因此,我觉得避免使用(get)与maps会更加简单。没有它,我可以将map放在第一位或第二位。
0

评论人:alexmiller

现在这可能也可以通过“get”的规范来实现。

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

我曾认为 (get m k) 等同于 (val (find m k)),但当我发现 m 不是关联时,情况并非如此,这对我来说非常惊讶。

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

我认为 get 应在第一个参数不是关联时也抛出异常。
对于非关联参数返回 nil 只会隐藏错误,我想不出任何有效的使用情况。

...