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分支。近期的一个提交将测试中的许多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上下文中需要的一行,以确保它能够干净地应用于最新的master版本。

0
_评论者:stuart.sierra_

CLJ-932 ({{contains?}}) 也可能是这样的,它“破坏”了一些已经出现问题的事物。

这个变化比CLJ-932更有侵略性,但我相信它更有可能暴露隐藏的错误,而不是破坏预期的行为。
0
评论人:alexisecret-import_

使用"({:a 1}, :a)"和安全的替换方法更符合习惯吗?例如,你能否在代码库中替换掉"(get"为"(",以便找到错误?我仍在学习这门语言,而且我不太年轻了,无法可靠地记住参数顺序。因此,我发现无论如何避免使用(get)来处理map更加方便。在没有它的帮助下,我可以把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将只会掩盖错误,我想不出任何有效的用例。

...