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

欢迎!请查看关于页面,以获取更多关于如何使用本站的信息。

+3
文档
编辑

hash-map的文档字符串表明它返回一个哈希表。
然而,有一个不带参数的可变长度,它返回一个空的数组哈希表。

因此,文档与实现之间存在矛盾。

1 个答案

0

这里的困惑点在于,“持久哈希表”是这里的抽象,但它有两个具体的实现:hash-map(PersistentHashMap)和array-map(PersistentArrayMap),后者根据map的大小转换为前者。

hash-map是持久哈希表(泛型)的构造函数,不保证返回的是具体的类型。然而,array-map是(明确地)数组表的构造函数。没有显式的构造函数用于PersistentHashMap。

by
如果你们说这里的抽象是“持久化映射”,我可以理解。但是“持久化哈希映射”就不那么明确了。

究竟是什么让数组映射成为哈希映射的实现?我在任何地方都没有找到关于它的提及(而且参考文献也明确地将数组映射作为单独的东西提到),而且这个实现根本不使用哈希,这也在意料之中。从概念上讲,除了两者都是映射之外,没有关于数组映射使其与哈希映射相关的东西。

即使我避免检查对任何此类映射上的`(type ...)`调用结果,仍然会与“哈希映射”这个词联系起来——即将会使用`hash`函数。有人可能会争论这根本不重要,我同意对于几乎所有的案例来说这是正确的,但是当调试任何与哈希和映射相关的事情时,这确实会导致困惑。

更让事情变得混淆的是,尽管现在普遍认为具有超过8个项的映射字面量是哈希映射,但`(hash-map 1 2)`将返回哈希映射,而不是数组映射。

还有其他的区别。至少,`print-dup`为`PersistentHashMap`定义了,但不是为`PersistentArrayMap`定义的,这导致了一些意想不到的事情,比如`#=(clojure.lang.PersistentArrayMap/create {})`。
by
好吧,“持久化映射”更公平,重要的类型是IPersistentMap。

你如何得到最后的例子?`pr`或`print`不会给你那个。
by
通过`(binding [*print-dup* true] (prn {}))`。
...