Rust koristi alat za provjeru posuđivanja kako bi proveo svoja pravila vlasništva i osigurao da su programi sigurni za memoriju. Pravila vlasništva diktiraju kako Rust upravlja memorijom preko stoga i gomile.
Dok pišete Rust programe, morat ćete koristiti varijable bez promjene vlasništva pridružene vrijednosti. Rust pruža robustan mehanizam posuđivanja za poticanje fleksibilnosti i ponovne upotrebe koda.
Što je posuđivanje u Rustu?
Posuđivanje je pristup vrijednosti varijable bez preuzimanje vlasništva nad varijablom pozivanjem na vlasnika. Provjera posuđivanja osigurava da je referenca valjana i da se podaci ne ispuštaju korištenjem konstrukcije koja se zove vijek trajanja.
Životni vijek je koliko dugo varijabla postoji. Životni vijek počinje stvaranjem varijable i završava uništavanjem varijable. Možete posuditi vlasništvo nad varijablom, a kada je posuđena referenca izvan opsega, vlasništvo se vraća varijabli vlasnika. Posuđivanje je pomalo slično pokazivače koje ćete pronaći u jezicima kao što su C++ i Go
. Ali prevodilac Rust koristi alat za provjeru posuđivanja kako bi osigurao da su programi sigurni za memoriju.Primjer posudbe u Rust
Možete posuditi vlasništvo nad varijablom pozivanjem na vlasnika pomoću simbola ampersand (&).
fnglavni() {
neka x = Niz::from("zdravo"); // x posjeduje "zdravo"
neka y = &x; // y upućuje na x, posuđuje "hello"
println!("{}", x);
println!("{}", y)
}
Bez posuđivanja referenciranjem, program bi paničario. To bi prekršilo pravilo vlasništva da vrijednost može imati jednog vlasnika, a dvije varijable ne mogu ukazivati na istu memorijsku lokaciju. Posuđivanje može biti vrlo korisno u funkcijama. Evo primjera posuđivanja u funkciji, kako bi se zadržalo vlasništvo dok se pozivaju druge funkcije koje uzimaju lokalne varijable kao argumente.
fnispis_čak(vectr: &Vec<i32>) {
za vrijednosti u vectr {
ako vrijednosti % 2 == 0 {
println!("{}", vrijednosti);
}
}
}
The ispis_čak funkcija referira na vektor 32-bitnih cijelih brojeva kao svoj argument. Zatim ispisuje retke vrijednosti koje su višekratnici dva u vektoru koristeći for-petlju i println! makro.
fnglavni() {
neka broj_vektor = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
print_even(&broj_vektor); // vlasništvo je posuđeno, a ne premješteno
println!("Glavna funkcija zadržava vlasništvo nad vektorom brojeva{:?}", broj_vektor)
}
Glavna funkcija deklarira varijablu number_vector i dodjeljuje joj vektor 32-bitnih cijelih brojeva. Zatim poziva funkciju print_even i prosljeđuje joj referencu na broj_vektor varijabla pomoću simbola ampersand.
Glavna funkcija zadržava vlasništvo nad broj_vektor varijabla može nastaviti koristiti vrijednost na svojoj memorijskoj lokaciji.
Posuđivanje i mijenjanje referenci
Funkcije također mogu modificirati posuđene varijable koristeći promjenjive reference na njih, prije vraćanja vlasništva.
Međutim, za razliku od običnih varijabli koje se mogu postaviti na promjenjive pomoću ključne riječi mut, promjenjivim referencama morate dodati znak &.
Prije pravljenja promjenjivih referenci, varijabla koju želite modificirati mora biti promjenjiva.
fnukloniti_vrijednost(vectr: &mutVec<i32>) -> &Vec<i32> {
vectr.remove(4);
povratak vektor
}
The ukloniti_vrijednost funkcija uzima referencu promjenjivog vektora 32-bitnih cijelih brojeva. Vraća vektor 32-bitnih cijelih brojeva nakon uklanjanja vrijednosti vektora u četvrtom indeksu.
fnglavni() {
nekamut brojevi = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
ukloni_vrijednost(&mut brojevi); // promjenjiva referenca ovdje
println!("{:?}", brojevi);
}
Funkcija mijenja brojevi vektor pozivanjem remove_value i prosljeđivanjem promjenjive reference vektora kao argumenta. Prilikom ispisa vektora, prethodni četvrti indeks vektora ne postoji.
Primijetite da je argument referenca na promjenjivi vektor.
Važno je razumjeti vlasništvo i posuđivanje
Morat ćete razumjeti vlasništvo i posuđivanje kako biste napisali učinkovit, memorijski siguran Rust kod koji se kompilira i pokreće. Ako vaš kôd ne slijedi pravila vlasništva, alat za provjeru posudbe će to otkriti. Morat ćete svoj program učiniti sigurnim za memoriju da bi ga Rust kompajlirao.
Provjera posudbe je dosadna kada ste novi u Rustu. No, kako budete pisali više Rust koda, naviknut ćete se na to i steći iskustvo u pisanju memorijsko sigurnog Rust koda.