Rust HashMap 支持指针稳定性,允许键引用其值

问题描述 投票:0回答:1

在 Rust 中,使用

HashMap
(其中键是
&str
)来引用其对应值中的
String
成员是不可能直接实现的。下面的例子说明了这个想法:

type PersonMap = HashMap<&str, Person>;

struct Person {
    name: String,
}

由于 Rust 的所有权和借用规则以及

HashMap
的大小调整,这是不可行的,如本答案中所述 (https://stackoverflow.com/a/61021022/84540)。

但是,我想知道是否存在支持指针稳定性的无序映射实现(什么是指针稳定性?),这可以使这种用法成为可能。或者由于 Rust 的生命周期检查而无法实现?谢谢。

rust hashmap lifetime
1个回答
0
投票

理论上,即使

String
也能提供指针稳定性,因为如果它移动,其内容也不会移动(尽管别名问题仍处于困境)。

实际上,指针稳定性还不够。代码没有 UB 就足够了,但还不足以通过借用检查器。借用检查器不允许自引用结构,并且它不关心指针稳定性。

我并不是说不能编写允许自引用结构的映射(它可能可以,但会涉及许多迭代漏洞)。也许它已经写好了。但如果存在这样的映射,则需要从头开始编写以处理自引用映射。这不仅仅是支持值引用键的“另一张地图”,从本质上来说,这是它的目标。

如果您正在寻找如何编写此类地图,您可以从许多现有的自我引用板条箱中汲取灵感。我想这样的地图会有与其中之一类似的设计,只是针对地图而不是通用结构进行定制。

© www.soinside.com 2019 - 2024. All rights reserved.