Rust använder en lånekontroll för att upprätthålla sina äganderegler och säkerställa att programmen är minnessäkra. Ägarskapsreglerna dikterar hur Rust hanterar minnet över stacken och högen.
När du skriver Rust-program måste du använda variabler utan att ändra ägandet av det tillhörande värdet. Rust ger en robust lånemekanism för att uppmuntra flexibilitet och kodåteranvändning.
Vad är att låna i rost?
Att låna är att komma åt värdet av en variabel utan ta äganderätten till variabeln genom att hänvisa till ägaren. Lånekontrollen säkerställer att referensen är giltig och att data inte släpps med en konstruktion som kallas livstider.
En livstid är hur länge en variabel existerar. Livstider börjar på variabel skapelse och slutar på variabel förstörelse. Du kan låna äganderätten till en variabel, och när den lånade referensen är utanför räckvidden återgår ägandet till ägarvariabeln. Att låna är lite som pekare du hittar på språk som C++ och Go. Men Rust-kompilatorn använder lånekontrollen för att säkerställa att programmen är minnessäkra.
Ett exempel på lån i rost
Du kan låna äganderätten till en variabel genom att referera till ägaren med et-tecken (&).
fnhuvud() {
låta x = Sträng::from("hej"); // x äger "hej"
låta y = &x; // y refererar x, lånar "hej"
println!("{}", x);
println!("{}", y)
}
Utan att låna genom att referera skulle programmet få panik. Det skulle bryta mot ägarregeln att ett värde kan ha en ägare och två variabler inte kan peka på samma minnesplats. Att låna kan vara mycket användbart i funktioner. Här är ett exempel på att låna i en funktion, för att behålla ägandet samtidigt som man anropar andra funktioner som tar lokala variabler som argument.
fnprint_even(vectr: &Vec<i32>) {
för värden i vectr {
om värden % 2 == 0 {
println!("{}", värden);
}
}
}
De print_even funktion refererar till en vektor med 32-bitars heltal som sitt argument. Den skriver sedan ut rader med värden som är multiplar av två i vektorn med hjälp av en for-loop och println! makro.
fnhuvud() {
låta antal_vektor = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
print_even(&number_vektor); // ägande är lånat, inte flyttat
println!("Huvudfunktionen behåller äganderätten till talvektorn{:?}", number_vector)
}
Huvudfunktionen deklarerar variabeln nummer_vektor och tilldelar en vektor med 32-bitars heltal till den. Den anropar sedan print_even-funktionen och skickar den en referens till antal_vektor variabel med et-tecken.
Huvudfunktionen behåller ägandet av antal_vektor variabel kan den fortsätta att använda värdet på sin minnesplats.
Låna och muterande referenser
Funktioner kan också modifiera lånade variabler med hjälp av föränderliga referenser till dem innan de återgår till äganderätten.
Men till skillnad från vanliga variabler som kan ställas in på mutable med nyckelordet mut, måste du prefixa muterbara referenser med et-tecken.
Innan du gör föränderliga referenser måste variabeln som du vill modifiera vara föränderlig.
fnremove_value(vectr: &mutVec<i32>) -> &Vec<i32> {
vectr.remove(4);
lämna tillbaka vektor
}
De remove_value funktionen tar in referensen till en föränderlig vektor med 32-bitars heltal. Den returnerar en vektor med 32-bitars heltal efter att ha tagit bort värdet på vektorn i det fjärde indexet.
fnhuvud() {
låtamut nums = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
remove_value(&mut nums); // föränderlig referens här
println!("{:?}", nums);
}
Funktionen ändrar nums vektor genom att anropa remove_value och skicka den föränderliga referensen för en vektor som ett argument. Vid utskrift av vektorn existerar inte det föregående fjärde indexet för vektorn.
Lägg märke till att argumentet är en referens till en föränderlig vektor.
Det är viktigt att förstå ägande och upplåning
Du måste förstå ägande och lån för att skriva effektiv, minnessäker Rustkod som kompileras och körs. Om din kod inte följer ägarskapsreglerna kommer lånekontrollen att upptäcka den. Du måste göra ditt program minnessäkert för att Rust ska kunna kompilera det.
Lånekontrollen är irriterande när du är ny på Rust. Men när du skriver mer rostkod kommer du att vänja dig vid det och få erfarenhet av att skriva minnessäker rostkod.