Geschiedenis van de vraag
Collecties HashSet en HashMap zijn standaardstructuren uit std::collections die snelle hash-zoekopdrachten implementeren. Ze zijn ingebouwd in Rust sinds de eerste versies van de taal, maar de interne details van hun gebruik zorgen vaak voor complicaties, zelfs voor ervaren ontwikkelaars, vanwege het eigendomssysteem.
Probleem
Verwarring ontstaat bij het invoegen en ophalen van elementen (vooral als de waarden niet Copy zijn), bij het aanpassen van de collectie (mutable borrow), en bij het gebruik van verwijzingen als sleutels. Er is ook een probleem met de correcte implementatie van Eq/Hash voor gebruikerspecifieke types.
Oplossing
Voorbeeldcode:
use std::collections::HashMap; fn main() { let mut map = HashMap::new(); map.insert("key", 42); if let Some(value) = map.get("key") { println!("Gevonden waarde: {}", value); } }
Belangrijke kenmerken:
Kan ik meerdere mutable verwijzingen naar hetzelfde element van een HashMap verkrijgen?
Nee, de borrow checker staat dit niet toe om eigendomsproblemen te voorkomen.
Kan ik een string-literal "abc" direct gebruiken als sleutel voor HashMap<String, V>?
Nee, er wordt precies een String verwacht, en "abc" is een &'static str. Conversie is nodig: insert("abc".to_string(), val).
Kan ik een waarde uit een HashMap halen, deze in een aparte variabele opslaan en de HashMap blijven gebruiken?
Ja, je kunt een verwijzing naar de waarde verkrijgen via get – maar als je remove (of een move) doet, mutates de HashMap, en worden alle oude verwijzingen ongeldig.
Poging om zowel de sleutel als de waarde tegelijk te lenen en vervolgens de collectie te muteren:
let mut map = HashMap::new(); map.insert("abc".to_string(), 10); let val = map.get("abc"); map.insert("def".to_string(), 20); // fout borrow checker
Voordelen:
Nadelen:
Waarde ophalen, alleen werken met een kopie of kloon:
let mut map = HashMap::new(); map.insert("abc".to_string(), 10); if let Some(val) = map.get("abc") { let val = *val; // we kopiëren map.insert("def".to_string(), 20); // alles werkt }
Voordelen:
Nadelen: