ProgrammatieRust ontwikkelaar

Hoe werkt het omgaan met collecties in Rust (zoals Vec, HashMap)? Wat zijn de bijzonderheden van eigendom en wanneer is het nodig om elementen of een collectie te klonen?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In Rust implementeren de standaardcollecties (zoals Vec<T>, HashMap<K,V>, HashSet<T>, etc.) het principe van eigendom van de inhoud. Dit betekent dat de collectie eigenaar is van alle objecten die ze bevat en verantwoordelijk is voor het vrijgeven van hun geheugen bij verwijdering.

Bijvoorbeeld, de elementen die in een Vec<T> worden geplaatst, worden verplaatst (move) naar de vector, die daarna eigenaar van hen is:

let s = String::from("hi"); let mut v = Vec::new(); v.push(s); // s is nu verplaatst, niet meer toegankelijk

Als de collectie kopieerbare waarden bevat, worden ze gekopieerd; als ze verplaatsbare waarden zijn, worden de eigendomsrechten overgedragen. Elementen of een collectie moeten worden gekloond wanneer het nodig is om de oorspronkelijke waarde op twee plaatsen op te slaan, bijvoorbeeld:

let name = String::from("Olga"); let mut v = Vec::new(); v.push(name.clone()); println!("{}", name); // name is nog steeds toegankelijk, omdat het gekloond is

Misleidende vraag

Wat gebeurt er wanneer je een element invoegt in HashMap als je een verplaatsbaar datatype (bijvoorbeeld String) als sleutel gebruikt? Zal de oorspronkelijke sleutel beschikbaar blijven na het doorgeven aan HashMap::insert()?

Vaak geven mensen een onjuist antwoord: "De oorspronkelijke sleutel blijft toegankelijk na invoeging".

In werkelijkheid worden het eigendom van de sleutel en waarde overgedragen aan HashMap, en na invoeging kunnen ze niet zonder vooraf te klonen worden gebruikt:

let key = String::from("id"); let mut map = std::collections::HashMap::new(); map.insert(key, 42); // key is niet meer toegankelijk

Een poging om naar key te verwijzen zal een compilatiefout veroorzaken.

Voorbeelden van echte fouten door onwetendheid van de nuances van het onderwerp


Verhaal Een ontwikkelaar probeerde een na invoeging in Vec verplaatst object te gebruiken en kreeg de fout "value used here after move", zich niet realiserend dat de Vector nu eigenaar van het is.


Verhaal Bij het werken met HashMap vergaten ze de string sleutels te klonen, wat leidde tot de onmogelijkheid om ze op andere plaatsen te gebruiken, wat aanzienlijke herstructurering van de code vereiste.


Verhaal In een van de projecten probeerden ze een verwijzing naar een intern element van de vector buiten de functie te retourneren, zich niet realiserend dat de verwijzing ongeldig zou worden bij het wijzigen van de grootte van de vector. Dit leidde tot dangling references en een crash tijdens uitvoering (panic).