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
by

评论者:jafingerhut

2013年5月24日创建的补丁文件 patch clj-1107-throw-on-get-for-unsupported-types-patch-v2.txt 与 2012年11月13日创建的 patch 0001-CLJ-1107-Throw-exception-for-get-called-on-unsupport alike,只是在最新master版上应用良好。最近的一次提交将 CLJ-1099 中的许多 IllegalArgumentException 出现更改为了 Throwable,这是此更新补丁中唯一的变化。

0
by

评论者:jafingerhut

补丁文件 clj-1107-throw-on-get-for-unsupported-types-patch-v2.txt 于 2014年1月23日应用良好于 Clojure 的最新master,但在那之后到 2014年1月30日期间做的提交中不再是这样。我还没有检查这个补丁可能更新的难易程度。

0
by

评论者:stuart.sierra

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

0
by

评论者: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
by
_评论者: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只会隐藏错误,我想不出任何有效的使用场景。

...