将可变和不可变引用混合到HashMap中

时间:2015-05-01 18:38:46

标签: rust

我想创建一个函数,该函数获取与哈希表中的键相关联的值,如果此值不存在,则插入任意值(假设为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中不可避免地借用了Hadoop 2.6.0

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

1 个答案:

答案 0 :(得分:2)

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

set global event_scheduler = on

但你是对的,否则你必须分开电话:

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通话将始终失败。