Tôi muốn làm như sau:
- Tra cứu một
Vec
khóa nhất định và lưu trữ để sử dụng sau. - Nếu nó không tồn tại, hãy tạo một khoảng trống
Vec
cho khóa, nhưng vẫn giữ nó trong biến.
Làm thế nào để làm điều này một cách hiệu quả? Đương nhiên tôi nghĩ rằng tôi có thể sử dụng match
:
use std::collections::HashMap;
// This code doesn't compile.
let mut map = HashMap::new();
let key = "foo";
let values: &Vec<isize> = match map.get(key) {
Some(v) => v,
None => {
let default: Vec<isize> = Vec::new();
map.insert(key, default);
&default
}
};
Khi tôi thử nó, nó cho tôi các lỗi như:
error[E0502]: cannot borrow `map` as mutable because it is also borrowed as immutable
--> src/main.rs:11:13
|
7 | let values: &Vec<isize> = match map.get(key) {
| --- immutable borrow occurs here
...
11 | map.insert(key, default);
| ^^^ mutable borrow occurs here
...
15 | }
| - immutable borrow ends here
Tôi đã kết thúc với việc làm một cái gì đó như thế này, nhưng tôi không thích thực tế là nó thực hiện tra cứu hai lần ( map.contains_key
và map.get
):
// This code does compile.
let mut map = HashMap::new();
let key = "foo";
if !map.contains_key(key) {
let default: Vec<isize> = Vec::new();
map.insert(key, default);
}
let values: &Vec<isize> = match map.get(key) {
Some(v) => v,
None => {
panic!("impossiburu!");
}
};
Có cách nào an toàn để làm điều này chỉ với một cái match
?