Programmeerimiskeeled erinevad selle poolest, kuidas nad mälu käitlevad ja mäluhaldusreegleid jõustavad. Go ja Python kasutavad prügikogujaid, et arendajad saaksid keskenduda koodi kirjutamisele. C ja C++ annavad programmeerijatele vastutuse mälu haldamise eest madalamal tasemel.

Rust käsitleb mäluhaldust erinevalt, kasutades mõisteid, mida ta nimetab omandiks ja laenuks. See kasutab mälu ohutuse tõhusaks jõustamiseks laenukontrolli.

Mis on omandiõigus?

Omandiõigus on Rusti funktsioon ja kokkulepe, mis aitab tagada programmide mälu ohutuse ilma prügikogujata. See on veel üks viis toime tulla mälulekke probleem teie koodis.

Rust-kompilaator kontrollib, kas programm järgib kompileerimise ajal omandireegleid. Kui programm järgib neid reegleid, saab seda käivitada. Kui seda ei juhtu, keeldub kompilaator käivitatava faili loomisest.

Rust kontrollib omandireegleid kasutades laenata kontrollija. Laenamise kontrollija kontrollib omandimudelit ja otsustab, kas väärtus on mälus (virn või hunnik) on reguleerimisalast väljas või mitte. Kui väärtus ei kuulu selle kohaldamisalasse, pole see programmi teistele osadele juurdepääsetav, välja arvatud juhul, kui see on laenatud.

instagram viewer

Omandiõiguse reeglid

Roostes omab iga muutuja väärtus, millega see on lähtestatud, ja omanikke saab olla ainult üks. Kui omanik on kasutusalast väljas, siis väärtus langeb. Oluline on mõista omandireeglite üksikasju.

Esimene omandiõiguse reegel on see, et iga muutuja omab selle algväärtust.

lase omanik = String::from("üks");

The omanik ülaltoodud muutuja omab stringi üks ja erinevalt keeltest, nagu Python ja Go, jäetakse see väärtus muutuja ümbermääramisel välja.

Teine omandireegel on see, et kaks muutujat ei saa osutada samale mälukohale; igal väärtusel saab olla ainult üks omanik.

lase uus_omanik = omanik;

The uus_omanik muutuja omab nüüd väärtust, mis on salvestatud mälu asukohta omanik muutuv. Kui proovite kasutada omanik muutuja, satub kompilaator paanikasse ja keeldub käivitatava faili genereerimisest.

Enamikus prügikogujaid kasutavates keeltes võivad kaks muutujat osutada samale mälukohale. Siin on näide samaväärsest JavaScripti koodist:

lase omanik = "omanik";
lase uus_omanik = omanik;
konsool.log (uus_omanik);

Ülaltoodud JavaScripti koodi käivitamine töötab ilma vigadeta ja kui teete sama Go või Pythonis, töötab ka teie programm vigadeta.

Kolmas omandireegel on see, et kui muutuja on deklareeritud ulatusest väljas, siis väärtus langeb ja mälu vabastatakse.

// muutuja eraldi ulatuses
{
lase näide = String::from("Siin on uus ulatus");
}

printida!("{}", näide)

Te ei pääse juurde näiteks muutuja väljaspool selle ulatust; selle proovimine põhjustab kompilaatoris paanika.

Omandiõigus funktsioonides

Kui annate funktsioonile väärtuse argumendina, pääseb funktsioon sellele muutujale juurde isegi siis, kui seda ei deklareeritud selle ulatuses:

fnprinter(väärtus: String) -> String {
tagasi väärtus
}

fnpeamine() {
lase x = String::from("Prindib väärtuse"); // x omab stringi väärtust

// omandiõigus teisaldatakse siin printeri funktsioonile
printida!("{} Tulemus trükkimine X on see -:", printer (x));
}

Funktsioon pääseb sellele muutujale juurde, kuna Rust annab kompileerimise ajal selle omandiõiguse funktsioonile.

Võib arvata, et muutujat on siiski võimalik hiljem selle algses ulatuses kasutada:

fnprinter(väärtus: String) -> String {
tagasi väärtus
}

fnpeamine() {
lase x = String::from("Prindib väärtuse");
printida!("{} Tulemus of Printing x on see -:", printer (x));

// Muutuja kasutamine pärast selle väärtuse omandiõiguse üleandmist
println!("{} ei tohiks olla juurdepääsetav", x)
}

Kuid kui proovite seda teha, satub kompilaator paanikasse ja keeldub käivitatava faili loomisest:

Rooste eelistab koodi korduvkasutatavust

Koodi korduvkasutatavus on oluline tava, kuid koodi korduvkasutatavuse harjutamiseks peate mõistma Rusti omandireegleid.

Rust on väga paindlik programmeerimiskeel. See pakub selliseid mõisteid nagu laenamine, teisaldamine, kopeerimine ja omandiõiguse kloonimine muutuva korduvkasutatavuse tagamiseks.