Rust bruger en lånekontrol til at håndhæve sine ejerskabsregler og sikre, at programmer er hukommelsessikre. Ejerskabsreglerne dikterer, hvordan Rust styrer hukommelsen over stakken og dyngen.

Når du skriver Rust-programmer, skal du bruge variabler uden at ændre ejerskabet af den tilknyttede værdi. Rust giver en robust lånemekanisme for at fremme fleksibilitet og genbrug af kode.

Hvad er lån i rust?

Lån er at få adgang til værdien af ​​en variabel uden tage ejerskab af variablen ved at henvise til ejeren. Lånekontrollen sikrer, at referencen er gyldig, og at dataene ikke slettes ved hjælp af en konstruktion kaldet levetider.

En levetid er, hvor længe en variabel eksisterer. Levetider starter med variabel skabelse og slutter med variabel ødelæggelse. Du kan låne ejerskabet af en variabel, og når den lånte reference er uden for rækkevidde, vender ejerskabet tilbage til ejervariablen. Lån er lidt ligesom pointere, du finder på sprog som C++ og Go. Men Rust-kompileren bruger lånekontrollen til at sikre, at programmer er hukommelsessikre.

instagram viewer

Et eksempel på lån i rust

Du kan låne ejerskabet af en variabel ved at henvise til ejeren ved at bruge og-tegnet (&).

fnvigtigste() {
lade x = Snor::fra("hej"); // x ejer "hej"
lade y = &x; // y referencer x, låner "hej"
println!("{}", x);
println!("{}", y)
}

Uden at låne ved at referere, ville programmet gå i panik. Det ville overtræde ejerskabsreglen, at en værdi kan have én ejer, og to variabler kan ikke pege på den samme hukommelsesplacering. Lån kan være meget nyttigt i funktioner. Her er et eksempel på lån i en funktion for at bevare ejerskabet, mens du kalder andre funktioner, der tager lokale variabler som argumenter.

fnprint_even(vectr: &Vec<i32>) {
til værdier i vectr {
hvis værdier % 2 == 0 {
println!("{}", værdier);
}
}
}

Det print_even funktion refererer til en vektor med 32-bit heltal som sit argument. Den udskriver derefter linjer med værdier, der er multipla af to i vektoren ved hjælp af en for-løkke og println! makro.

fnvigtigste() {
lade tal_vektor = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
print_even(&nummer_vektor); // ejerskab er lånt, ikke flyttet
println!("Hovedfunktionen bevarer ejerskabet af talvektoren{:?}", tal_vektor)
}

Hovedfunktionen erklærer variablen number_vector og tildeler den en vektor med 32-bit heltal. Den kalder derefter print_even-funktionen og sender den en reference til antal_vektor variabel ved hjælp af og-tegnet.

Hovedfunktionen bevarer ejerskabet af antal_vektor variabel kan den fortsætte med at bruge værdien på sin hukommelsesplacering.

Lån og muterende referencer

Funktioner kan også ændre lånte variabler ved at bruge foranderlige referencer til dem, før de returnerer ejerskabet.

Men i modsætning til almindelige variabler, der kan indstilles til mutable ved hjælp af mut-nøgleordet, skal du præfikse mutable referencer med og-tegnet.

Før du laver foranderlige referencer, skal den variabel, du ønsker at ændre, kunne ændres.

fnfjern_værdi(vectr: &mutVec<i32>) -> &Vec<i32> {
vectr.remove(4);
Vend tilbage vektor
}

Det fjern_værdi funktion tager referencen til en foranderlig vektor af 32-bit heltal. Det returnerer en vektor med 32-bit heltal efter at have fjernet værdien af ​​vektoren i det fjerde indeks.

fnvigtigste() {
lademut tal = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
fjern_værdi(&mut nums); // foranderlig reference her
println!("{:?}", nums);
}

Funktionen ændrer nums vektor ved at kalde remove_value og sende den foranderlige reference for en vektor som et argument. Ved udskrivning af vektoren eksisterer det foregående fjerde indeks af vektoren ikke.

Bemærk, at argumentet er en reference til en foranderlig vektor.

Det er vigtigt at forstå ejerskab og låntagning

Du bliver nødt til at forstå ejerskab og lån for at skrive effektiv, hukommelsessikker rustkode, der kompilerer og kører. Hvis din kode ikke følger ejerskabsreglerne, vil lånekontrollen opdage det. Du skal gøre dit program hukommelsessikkert, for at Rust kan kompilere det.

Lånekontrollen er irriterende, når du er ny i Rust. Men efterhånden som du skriver mere rustkode, vil du vænne dig til det og få erfaring med at skrive hukommelsessikker rustkode.