我想创建一个函数,该函数获取与哈希表中的键相关联的值,如果此值不存在,则插入任意值(假设为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
。
我看不出在这个函数中分离可变部分和不可变部分的方法。
答案 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
通话将始终失败。