Ich möchte Folgendes tun:
- Suchen Sie
Vec
nach einem bestimmten Schlüssel und speichern Sie ihn zur späteren Verwendung. - Wenn es nicht vorhanden ist, erstellen Sie ein Leerzeichen
Vec
für den Schlüssel, behalten Sie es jedoch in der Variablen bei.
Wie geht das effizient? Natürlich dachte ich, ich könnte verwenden 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
}
};
Als ich es versuchte, gab es mir Fehler wie:
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
Am Ende habe ich so etwas gemacht, aber ich mag die Tatsache nicht, dass es die Suche zweimal durchführt ( map.contains_key
und 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!");
}
};
Gibt es einen sicheren Weg, dies mit nur einem zu tun match
?
&T
(wenn die Schlüssel die Karte überleben, z. B. statische Zeichenfolgen) oderRc<T>
anstelle vonT
- aber es ist in beiden Fällen nicht schönv.key()
im Ausdruck für verwendendefault
, und dann wird ein Verweis auf den Schlüssel erhalten, wie er in der Hashmap vorhanden ist, so dass Sie einen Klon auf diese Weise vermeiden können