【发布时间】:2019-03-21 15:52:01
【问题描述】:
我想使用HashMap 来缓存依赖于映射中其他条目的昂贵计算。条目模式仅提供对匹配值的可变引用,但不提供对 HashMap 其余部分的引用。我非常感谢有关解决此(不正确)玩具示例的更好方法的反馈:
use std::collections::HashMap;
use std::collections::hash_map::Entry::{Occupied, Vacant};
fn compute(cache: &mut HashMap<u32, u32>, input: u32) -> u32 {
match cache.entry(input) {
Vacant(entry) => if input > 2 {
// Trivial placeholder for an expensive computation.
*entry.insert(compute(&mut cache, input - 1) +
compute(&mut cache, input - 2))
} else {
0
},
Occupied(entry) => *entry.get(),
}
}
fn main() {
let mut cache = HashMap::<u32, u32>::new();
let foo = compute(&mut cache, 12);
println!("{}", foo);
}
上述sn-p的问题是cache.entry不可变地借用cache,但我也想更新cache。
【问题讨论】:
-
如果您更改了 hashmap,
entry如何仍然有效? -
Stargateur -- 因为entry 只是哈希映射中单个项目的视图,它与其他元素或多或少无关似乎是合理的。但这是一个有趣的点,因为改变哈希映射可能会导致冲突处理逻辑影响
entry——我还没有研究它是如何实现的。 -
我不知道任何可以实现您尝试的 hashmap 的实现。
-
你是对的——借用检查器无法推断它们是互斥的键突变。干杯!
标签: hashmap rust borrow-checker borrowing