2024 Clojure 状态调查中分享您的想法!

欢迎!请参阅关于页面,以获取更多关于此如何工作的信息。

+3
文档
修改

hash-map的文档说明它返回哈希映射。
然而,有一个没有参数的等级返回空数组映射。

因此,文档与实现之间存在差异。

1 答案

0

这里混淆的点在于“持久化哈希映射”是抽象概念,但是有两种具体的实现:hash-map(PersistentHashMap)和array-map(PersistentArrayMap),后者根据映射大小转换为前者。

hash-map是持久化哈希映射抽象的构造函数(通用),不会保证返回具体类型。然而array-map(明确地)是数组映射的构造函数。没有明确定义为PersistentHashMap的构造函数。

我理解如果你说这里的抽象是“持久化映射”,但是对于“持久化哈希映射”就不是很理解了。

究竟什么使得数组映射成为哈希映射的实现?我在任何地方都没有找到关于它的提及(而且参考资料中明确将数组映射作为独立的东西提到),并且实现中根本没有使用哈希,这是预期的。从概念上讲,数组映射与哈希映射之间除了都是映射的事实外,没有任何关联之处。

即使我避免检查调用任何此类映射的`(type ...)`的结果,关于“哈希映射”这个词还是有期待——即会使用哈希函数。有人可能会说这根本不重要,我也同意对于几乎所有情况都是正确的,但是在调试与哈希和映射相关的事实时会非常令人困惑。

更令人困惑的是,尽管现在普遍认为具有超过8个条目的映射字面量是哈希映射,但是`(hash-map 1 2)`会返回哈希映射,而不是数组映射。

还有其他区别。至少,`print-dup`在`PersistentHashMap`中被定义,但在`PersistentArrayMap`中没有定义,导致出现意外的结果,比如`#=(clojure.lang.PersistentArrayMap/create {})`。
好吧,“持久化映射”听起来更合理,重要的类型是IPersistentMap。

你是如何得到最后一个例子的?`pr`或`print`都不会给你那样的结果。
使用`(binding [*print-dup* true] (prn {}))`。
...