Programski se jezici razlikuju po načinu na koji rukuju memorijom i provode pravila upravljanja memorijom. Go i Python zapošljavaju sakupljače smeća, tako da se programeri mogu usredotočiti na pisanje koda. C i C++ programerima daju odgovornost za upravljanje memorijom na nižoj razini.
Rust upravljanje memorijom tretira drugačije, koristeći koncepte koje naziva vlasništvo i posuđivanje. Koristi "borrow checker" za učinkovito provođenje sigurnosti memorije.
Što je vlasništvo?
Vlasništvo je značajka i konvencija Rusta koja pomaže osigurati sigurnost memorije programa bez skupljača smeća. To je još jedan način rješavanja problem curenja memorije u vašem kodu.
Rust kompajler provjerava poštuje li program pravila vlasništva tijekom kompilacije. Ako program slijedi ova pravila, može se pokrenuti. Ako nije, kompajler odbija proizvesti izvršnu datoteku.
Rust provjerava pravila vlasništva pomoću posuditi čeker. Provjera posudbe provjerava model vlasništva i odlučuje je li vrijednost u memoriji (stog ili gomila
) je izvan opsega ili ne. Ako je vrijednost izvan svog opsega, nije dostupna drugim dijelovima programa osim ako nije posuđena.Pravila vlasništva
U Rustu svaka varijabla posjeduje vrijednost s kojom je inicijalizirana i može postojati samo jedan vlasnik. Nakon što je vlasnik izvan opsega, vrijednost se ispušta. Važno je razumjeti pojedinosti pravila vlasništva.
Prvo pravilo vlasništva je da svaka varijabla posjeduje svoju početnu vrijednost.
neka vlasnik = Niz::od("jedan");
The vlasnik gornja varijabla posjeduje niz jedan i, za razliku od jezika kao što su Python i Go, ta će vrijednost biti ispuštena pri ponovnoj dodjeli varijable.
Drugo pravilo vlasništva je da dvije varijable ne mogu ukazivati na istu memorijsku lokaciju; svaka vrijednost može imati samo jednog vlasnika.
neka novi_vlasnik = vlasnik;
The novi_vlasnik varijabla sada posjeduje vrijednost pohranjenu na memorijskoj lokaciji vlasnik varijabla. Ako pokušate koristiti vlasnik varijable, kompajler će se uspaničiti i odbiti će generirati izvršnu datoteku.
U većini jezika koji koriste sakupljače smeća, dvije varijable mogu ukazivati na istu memorijsku lokaciju. Evo primjera ekvivalentnog JavaScript koda:
neka owner = "vlasnik";
neka novi_vlasnik = vlasnik;
konzola.log (novi_vlasnik);
Pokretanje gornjeg JavaScript koda funkcionira bez pogrešaka, a ako isto učinite u Gou ili Pythonu, i vaš će program raditi bez pogrešaka.
Treće pravilo vlasništva je da kada varijabla izađe iz deklariranog opsega, vrijednost se odbacuje, a memorija se oslobađa.
// varijabla u zasebnom opsegu
{
neka primjer = Niz::from("Evo novog opsega");
}
ispis!("{}", primjer)
Ne možete pristupiti primjer varijabla izvan svog opsega; pokušaj da to učini izazvat će paniku kod kompilatora.
Vlasništvo u funkcijama
Kada proslijedite vrijednost funkciji kao argument, funkcija može pristupiti toj varijabli iako nije deklarirana u svom opsegu:
fnpisač(vrijednost: Niz) -> Niz {
povratak vrijednost
}fnglavni() {
neka x = Niz::from("Ispisuje vrijednost"); // x posjeduje vrijednost niza
// vlasništvo je ovdje premješteno na funkciju pisača
ispis!("{} The Proizlaziti ispisa X je da je -:", pisač (x));
}
Funkcija može pristupiti toj varijabli jer Rust premješta vlasništvo nad njom na funkciju tijekom kompajliranja.
Možda mislite da je još uvijek moguće koristiti varijablu kasnije u njenom izvornom opsegu:
fnpisač(vrijednost: Niz) -> Niz {
povratak vrijednost
}fnglavni() {
neka x = Niz::from("Ispisuje vrijednost");
ispis!("{} The Proizlaziti ispisa x je to -:", pisač (x));
// Pokušaj korištenja varijable nakon prijenosa vlasništva nad njenom vrijednošću
println!("{} ne bi trebao biti dostupan", x)
}
Ali ako pokušate ovo, kompajler će se uspaničiti i odbiti proizvesti izvršnu datoteku:
Rust daje prednost ponovnoj upotrebi koda
Ponovna upotreba koda bitna je praksa, ali da biste prakticirali ponovnu upotrebu koda morate razumjeti Rustova pravila vlasništva.
Rust je vrlo fleksibilan programski jezik. Omogućuje koncepte poput posuđivanja, premještanja, kopiranja i kloniranja vlasništva za varijabilnu ponovnu upotrebu.