Nicht leihen unveränderlich ausgeliehen Inhalt als veränderlich
Ich versuche zu entwickeln, die eine message-routing-app. Ich habe gelesen, die offizielle Rost docs und einige Artikel und dachte, dass ich bekam, wie Zeiger, den Besitz und Kreditaufnahme Zeug funktioniert, aber erkannte, dass ich nicht.
use std::collections::HashMap;
use std::vec::Vec;
struct Component {
address: &'static str,
available_workers: i32,
lang: i32
}
struct Components {
data: HashMap<i32, Vec<Component>>
}
impl Components {
fn new() -> Components {
Components {data: HashMap::new() }
}
fn addOrUpdate(&mut self, component: Component) -> &Components {
if !self.data.contains_key(&component.lang) {
self.data.insert(component.lang, vec![component]);
} else {
let mut q = self.data.get(&component.lang); //this extra line is required because of the error: borrowed value does not live long enough
let mut queue = q.as_mut().unwrap();
queue.remove(0);
queue.push(component);
}
self
}
}
(Auch auf der Spielplatz)
Erzeugt den Fehler:
error: cannot borrow immutable borrowed content `**queue` as mutable
--> src/main.rs:26:13
|
26 | queue.remove(0);
| ^^^^^ cannot borrow as mutable
error: cannot borrow immutable borrowed content `**queue` as mutable
--> src/main.rs:27:13
|
27 | queue.push(component);
| ^^^^^ cannot borrow as mutable
Könntest du bitte erläutern Sie den Fehler und es wäre toll, wenn du mir die richtige Umsetzung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein MCVE zu deinem problem:
Vor NLL
Nach NLL
Viele Male, wenn etwas überraschend wie dieser, ist es sinnvoll,drucken Sie die Typen beteiligt. Let ' s print aus der Art der
queue
:Haben wir eine veränderlich Verweis auf ein unveränderlich Verweis auf eine
Vec<u8>
. Denn wir haben eine unveränderliche Referenz auf dieVec
wir es nicht ändern können! Ändernself.data.get
zuself.data.get_mut
ändert den Typ zu&mut &mut collections::vec::Vec<u8>
und der code wird kompiliert.Wenn Sie wollen, um die Umsetzung des Konzepts "insert " oder" update", die Sie überprüfen sollten, in die
Eintrag
- API, die effizienter und prägnant.Darüber hinaus, Rost verwendet
snake_case
für die Methode der Benennung, nichtcamelCase
.