你好已经表明 https://stackoverflow.com/a/52848887/155423如何获得工作代码,但我想更深入地了解代码无法编译的原因。
您提出的代码cannot静态验证内存安全。您的递归调用完全有可能尝试访问相同的索引。查看这个简化的代码以了解一种可能性:
use std::collections::{hash_map::Entry, HashMap};
fn compute(cache: &mut HashMap<u32, u32>) {
if let Entry::Vacant(_entry) = cache.entry(42) {
let _aliased_mutable_reference = cache.get_mut(&42).unwrap();
}
}
现在这个有two可变引用指向相同的值,违反了参考文献规则 https://doc.rust-lang.org/book/second-edition/ch04-02-references-and-borrowing.html#the-rules-of-references.
另外,如果内部调用使用了怎么办?entry
它不存在?
use std::collections::{hash_map::Entry, HashMap};
fn compute(cache: &mut HashMap<u32, u32>) {
if let Entry::Vacant(entry1) = cache.entry(42) {
if let Entry::Vacant(entry2) = cache.entry(41) {
entry2.insert(2);
entry1.insert(1);
}
}
}
现在,当您通过以下方式将值插入到地图中时:entry2
,映射可能会重新分配底层内存,从而使所持有的引用无效entry1
,违反了other参考文献规则。
Rust 阻止您在程序中引入两种可能的内存不安全类型;就像它的设计初衷一样。