HashMap::get_mut触发返回局部值引用错误,有什么高效规避方案?
问题原因
这个报错是Rust借用检查器的生命周期推导逻辑导致的:它的生命周期分析是路径无关的,只会基于类型做统一推导。你调用get_mut时传入的键k的生命周期和局部变量s绑定,借用检查器会直接判定该局部生命周期被关联到了HashMap上,即使你实际插入的是拥有'static生命周期的所有权键,也不会通过分支逻辑识别出这一点,因此认为HashMap不能脱离当前栈帧返回。
无额外开销的规避方案
直接使用Rust 1.60版本后稳定的HashMap::raw_entry_mut API即可,它既可以实现和entry一致的单次哈希查找,也不需要提前传入持有所有权的键,仅在键不存在需要插入时才会做一次键的所有权转换,完全没有多余的内存拷贝或分配开销:
use std::borrow::Cow; use std::collections::HashMap; use std::collections::hash_map::RawEntryMut; fn get_string() -> String { String::from("xxxxxxx") } fn foo() -> HashMap<Cow<'static, str>, usize> { let mut v = HashMap::new(); let s = get_string(); let k = Cow::from(&s[2..3]); match v.raw_entry_mut().from_key(&k) { RawEntryMut::Occupied(mut entry) => { *entry.get_mut() += 1; } RawEntryMut::Vacant(entry) => { // 仅当键不存在时才转为拥有所有权的'static Cow,无多余拷贝 entry.insert(Cow::from(k.into_owned()), 0); } } v }
该方案的开销和你原本写的get_mut+insert逻辑完全一致,同时完美规避了生命周期检查的限制,不需要做任何预分配操作。
内容的提问来源于stack exchange,提问作者Masklinn
相关产品推荐
相关产品推荐

