分享您的观点,参加 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

即使 soupsole.core/get 的初始设计很模糊/错误,现在后悔也来不及了。这种变更没有价值。将破坏太多程序/库。
我们目前能做的最好的事情是创建一个具有这种新行为的 clojure.core/get2my-lib.core/get

此外,我无法断言这个 get2 在行为上比我们的 get 更好/更正确。它只是 get 的一组新规则。正如你提出的这组新规则,你能保证在另一天,不会有人出现并提出针对 get 的新规则吗? maybe a get3?你何时才会停止呢?

0

评论者:jafingerhut

名为 Patch clj-1107-throw-on-get-for-unsupported-types-patch-v2.txt 的补丁,日期为 2013 年 5 月 24 日,与 2012 年 11 月 13 日的 0001-CLJ-1107-Throw-exception-for-get-called-on-unsupport.patch 完全相同,但它可以干净地应用到最新的 master 上。最近关于 CLJ-1099 的提交将测试中的许多 IllegalArgumentException 发生情况更改为了 Throwable,这是这个更新补丁中唯一发生变化的地方。

0

评论者:jafingerhut

名为 Patch 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 完全相同,保留了其作者身份。唯一的区别在于 diff 日志中的一行,这是为了使其可以干净地应用到最新的 master 上。

0
_评论者:stuart.sierra_

CLJ-932 ({{contains?}}) 可能也如此,它“破坏”了一些已损坏的东西。

这个更改比 CLJ-932 更具侵略性,但我相信它更可能暴露隐藏的 bug 而不是破坏故意的行为。
0
_由 alex+import_ 发布的评论

使用"({:a 1}, :a)"和一个安全的替换启动是否更地道?例如,能否在一个代码库中将"(get "替换为"(",以找到错误?我仍在学习这门语言,而且不再年轻,无法可靠地记住参数顺序。因此,我发现避免使用(map)的(get)更为容易。没有它,我可以先把map放第一或第二。
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将仅掩盖错误,我无法想到任何有效的用例。

...