【问题标题】:Mixing mutable and immutable references to a HashMap [duplicate]混合对HashMap的可变和不可变引用[重复]
【发布时间】:2015-05-01 18:38:45
【问题描述】:

我想创建一个函数,它获取与哈希表中的键关联的值,如果这样的值不存在,则插入任意值(假设为 0)。

use std::collections::HashMap;

fn get_or_insert(table: &mut HashMap<i32, i32>, key: i32) -> i32 {
    match table.get(&key) {
        None => table.insert(key, 0).unwrap(),
        Some(v) => *v,
    }
}

此代码无法编译:

error[E0502]: cannot borrow `*table` as mutable because it is also borrowed as immutable
 --> src/main.rs:5:17
  |
4 |     match table.get(&key) {
  |           ----- immutable borrow occurs here
5 |         None => table.insert(key, 0).unwrap(),
  |                 ^^^^^ mutable borrow occurs here
6 |         Some(v) => *v,
7 |     }
  |     - immutable borrow ends here

确实,table 是在方法 insert 中可变借用的,而在方法 get 中是不可变借用的。

我看不出有办法在这个函数中分离可变部分和不可变部分。

【问题讨论】:

    标签: rust


    【解决方案1】:

    现在是使用entry 方法的好时机:

    use std::collections::HashMap;
    
    fn get_or_insert(table: &mut HashMap<i32, i32>, key: i32) -> i32 {
        *table.entry(key).or_insert(0)
    }
    
    fn main() {}
    

    但你是对的,否则你必须拆分通话:

    fn get_or_insert(table: &mut HashMap<i32, i32>, key: i32) -> i32 {
        match table.get(&key) {
            None => {}
            Some(v) => return *v,
        }
    
        table.insert(key, 0).unwrap()
    }
    

    但是,您必须再次计算哈希值,这是创建 entry 的部分原因。

    附带说明,insert 返回键的上一个值。如果我没看错的话,你的unwrap 调用总是会失败。

    【讨论】:

    • 谢谢,我不知道有 return 关键字。这很有用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2014-07-21
    • 2020-12-08
    • 2016-04-22
    • 2012-01-28
    • 2019-02-05
    • 1970-01-01
    相关资源
    最近更新 更多