Achtergrond:
In Rust is een van de vaak gebruikte collecties de HashMap — een associatieve array, geïmplementeerd als een hash-tabel. Het verschil met de Rust-implementatie is de strikte naleving van eigendoms- en geheugenveiligheidsregels, evenals thread-safety alleen onder bepaalde voorwaarden.
Probleem:
In tegenstelling tot andere talen met garbage-collection, vereisen alle bewerkingen met HashMap (toevoegen, ophalen, modificeren) dat de eigendomsregels worden nageleefd. Bijvoorbeeld, je kunt de collectie niet wijzigen als er actieve referenties zijn naar de inhoud. Er rijst ook een eigendomskwestie bij invoer: elementen worden ofwel verplaatst of gekopieerd. En bij concurrerende toegang is er een risico op data race.
Oplossing:
get_mut of entry API.Codevoorbeeld:
use std::collections::HashMap; fn main() { let mut map = HashMap::new(); map.insert("key", 10); if let Some(value) = map.get_mut("key") { *value += 1; } println!("{:?}", map.get("key")); }
Belangrijke kenmerken:
Kan er gelijktijdige toegang zijn tot meerdere elementen van HashMap via verschillende referenties?
Nee, Rust staat dit niet toe via de standaard API: iteratie met wijziging is alleen mogelijk met een exclusieve referentie naar de hele HashMap.
Wat gebeurt er als je een mutabele en niet-mutabele referentie naar hetzelfde element probeert te verkrijgen?
De compiler geeft een foutmelding vanwege schending van de borrow checker-regels: je kunt geen mutabele en niet-mutabele lening van dezelfde waarde combineren.
Werkt de API entry() alleen voor het invoegen van nieuwe elementen?
Nee, via de Entry API kun je ook toegang krijgen tot het modificeren van een bestaande waarde, niet alleen voor invoer.
map.entry("key").and_modify(|v| *v += 1).or_insert(0);
Het verstrekken van referenties naar waarde van HashMap in globale variabelen zonder garantie van de levensduur van de kaart.
Voordelen:
Nadelen:
Het verpakken van HashMap in Arc<Mutex<_>> voor gebruik uit meerdere threads.
Voordelen:
Nadelen: