在 Rust 中,使用
HashMap
(其中键是 &str
)来引用其对应值中的 String
成员是不可能直接实现的。下面的例子说明了这个想法:
type PersonMap = HashMap<&str, Person>;
struct Person {
name: String,
}
由于 Rust 的所有权和借用规则以及
HashMap
的大小调整,这是不可行的,如本答案中所述 (https://stackoverflow.com/a/61021022/84540)。
但是,我想知道是否存在支持指针稳定性的无序映射实现(什么是指针稳定性?),这可以使这种用法成为可能。或者由于 Rust 的生命周期检查而无法实现?谢谢。
理论上,即使
String
也能提供指针稳定性,因为如果它移动,其内容也不会移动(尽管别名问题仍处于困境)。
实际上,指针稳定性还不够。代码没有 UB 就足够了,但还不足以通过借用检查器。借用检查器不允许自引用结构,并且它不关心指针稳定性。
我并不是说不能编写允许自引用结构的映射(它可能可以,但会涉及许多迭代漏洞)。也许它已经写好了。但如果存在这样的映射,则需要从头开始编写以处理自引用映射。这不仅仅是支持值引用键的“另一张地图”,从本质上来说,这是它的目标。
如果您正在寻找如何编写此类地图,您可以从许多现有的自我引用板条箱中汲取灵感。我想这样的地图会有与其中之一类似的设计,只是针对地图而不是通用结构进行定制。