Rust循环每次迭代可变借用HashMap报E0499错误如何解决
问题原因
报错和循环写法无关,核心是func函数的生命周期标注错误:
你将HashMap可变引用的生命周期、HashMap内部存储的&str键的生命周期声明为了同一个'a,这会让编译器强制推断:这个对HashMap的可变借用必须存活到和内部键引用一样长的时间。而HashMap本身的作用域覆盖整个函数,内部键的生命周期和HashMap本身绑定,编译器就会认为每次调用func产生的可变借用会一直持续到函数结束,不会在单次循环迭代末尾释放,自然触发“同一时间存在多个可变借用”的所有权错误。
另外你的示例代码还有两个无关的小笔误:
unimplimented!()拼写错误,正确宏名是unimplemented!()loop是Rust内置关键字,不能作为函数名使用
修复方法
将可变引用的生命周期和HashMap内部键的生命周期拆分,不要绑定为同一个生命周期即可:
use std::collections::HashMap; // 可变引用单独使用生命周期'b,和内部键的生命周期'a做区分 fn func<'a, 'b>(hash_map: &'b mut HashMap<&'a str, String>) { unimplemented!(); } fn main() { let mut hash_map = HashMap::new(); let mut i = 0; while i < 10 { func(&mut hash_map); i += 1; } }
这种场景下甚至不需要手动标注生命周期,直接使用Rust的生命周期省略规则写代码即可,编译器会自动推导正确的生命周期关系:
use std::collections::HashMap; // 无需手动写生命周期标注,自动推导即可满足需求 fn func(hash_map: &mut HashMap<&str, String>) { unimplemented!(); } fn main() { let mut hash_map = HashMap::new(); let mut i = 0; while i < 10 { func(&mut hash_map); i += 1; } }
修复后编译器可以正确识别:每次调用func时传入的可变借用的生命周期仅持续到当次函数调用结束,会在单次循环迭代末尾被释放,下一次迭代可以合法获取新的可变借用,不会触发所有权冲突。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

