欢迎!请参阅关于页面以获取更多关于如何操作的信息。
评论由:richhickey 发布
这将是一个破坏性变化
即使 clojure.core/get 的初始设计可能令人困惑/不正确,现在改也来不及了。这种改变不值得。将会破坏太多程序/库。我们现在能做得更好的是创建一个具有这种新行为的 clojure.core/get2 或 my-lib.core/get。
clojure.core/get
clojure.core/get2
my-lib.core/get
此外,我无法断言这个get2的行为比我们的get更好/更正确。这只是get的另一套规则。既然你提出了这组新规则,那么谁能保证在另一天,不会有人出现并为get提出另一套新规则?比如get3?你如何知道何时停止呢?
get2
get
get3
评论人: 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,这是此更新补丁中唯一更改的内容。
clj-1107-throw-on-get-for-unsupported-types-patch-v2.txt补丁作为2014年1月23日的Clojure master版本干净地应用,但之后在2014年1月30日之间提交到Clojure的commit已不再这样做。我还没有检查更新此补丁可能有多难或有多容易。
评论人: stuart.sierra
根据5cc167a版本的master创建的新补丁0003-CLJ-1107-Throw-exception-for-get-on-unsupported-type.patch。
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版本。
评论者:alexmiller
可以推测,这也可以通过 "get" 的规范来完成。
我曾经认为 (get m k) 等同于 (val (find m k)),但当我发现当 m 不是关联性的情况下并非如此,这让我感到非常惊讶。
当 m 不是关联性时,find 会抛出异常,但 get 只返回 nil。
我认为 get 也应在第一个参数不是关联性时抛出异常。对于非关联性参数返回 nil 只会掩盖 bug,我想不出任何有效的用例。