Rust中HashMap插入/更新值后如何获取键数量?编译错误求助
解决HashMap插入/更新后获取键数量的借用冲突问题
这个报错是Rust的借用检查器在严格执行它的规则,咱们来拆解一下问题:
为什么会报错?
当你调用map.entry("Tom").or_insert(0)时,entry方法会返回一个指向HashMap中对应值的可变引用(&mut i32),并且这个引用被变量count持有。在Rust中,只要可变引用还存在,你就不能再对同一个对象进行任何不可变借用——而map.keys().len()正好需要对map进行不可变借用,这就触发了E0502错误。
几种可行的解决方案
方案1:用代码块限制可变引用的作用域
把修改值的代码放到一个单独的代码块里,这样代码块结束后,count变量就会被销毁,对应的可变借用也就释放了,之后就能安全地获取键的数量:
use std::collections::HashMap; fn main() { let mut map = HashMap::new(); { let count = map.entry("Tom").or_insert(0); *count += 1; } // 这里count被销毁,可变借用彻底释放 let size = map.keys().len(); println!("{} men found", size); }
方案2:避免持有可变引用,直接修改
不用把可变引用存到变量里,直接在一行完成值的更新,这样可变引用在执行完这行代码后就会立即释放:
use std::collections::HashMap; fn main() { let mut map = HashMap::new(); *map.entry("Tom").or_insert(0) += 1; // 没有持有可变引用,执行完就释放 let size = map.keys().len(); println!("{} men found", size); }
这两种方法都能解决借用冲突的问题,你可以根据代码的可读性需求选择合适的方式~
内容的提问来源于stack exchange,提问作者Kenneth
相关产品推荐
相关产品推荐

