请在 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 {}))`。
欢迎来到Clojure问答社区,您可以在此提问并获得Clojure社区成员的回答。
...