混合对 HashMap 的可变和不可变引用
Mixing mutable and immutable references to a HashMap
我想创建一个函数来获取与哈希表中某个键相关联的值,如果该值不存在,则插入一个任意值(假设为 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
.
中是不变借用的
我看不出有什么办法可以将这个函数中的可变部分和不可变部分分开。
这是使用 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
returns 键的 先前值 。如果我没看错的话,你的 unwrap
调用总是会失败。
我想创建一个函数来获取与哈希表中某个键相关联的值,如果该值不存在,则插入一个任意值(假设为 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
.
我看不出有什么办法可以将这个函数中的可变部分和不可变部分分开。
这是使用 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
returns 键的 先前值 。如果我没看错的话,你的 unwrap
调用总是会失败。