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 的初始设计可能是混乱的/错误的,现在改变也来不及了。这种改变不值得。这会破坏太多程序/库。
现在我们能做的最好的事是创建一个 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 发布

从 master 版本 5cc167a 创建了新的补丁 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 相同,并保留了其作者。唯一的区别是增加了一行差异上下文,以便干净地应用于最新的 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 只会隐藏错误,我想不到任何有效的用例。

...