Programavimo kalbos skiriasi tuo, kaip jos tvarko atmintį ir vykdo atminties valdymo taisykles. „Go“ ir „Python“ naudoja šiukšlių surinkėjus, todėl kūrėjai gali sutelkti dėmesį į kodo rašymą. C ir C++ suteikia programuotojams atsakomybę už žemesnio lygio atminties valdymą.
Rust atminties valdymą traktuoja skirtingai, naudodamas sąvokas, kurias vadina nuosavybe ir skolinimu. Jis naudoja „skolinimosi tikrintuvą“, kad efektyviai užtikrintų atminties saugą.
Kas yra Nuosavybė?
Nuosavybė yra „Rust“ funkcija ir susitarimas, padedantis užtikrinti programų be šiukšlių rinktuvo atminties saugumą. Tai dar vienas kovos būdas atminties nutekėjimo problema savo kode.
„Rust“ kompiliatorius patikrina, ar programa kompiliavimo metu laikosi nuosavybės taisyklių. Jei programa laikosi šių taisyklių, ji gali paleisti. Jei ne, kompiliatorius atsisako sukurti vykdomąjį failą.
Rust patikrina nuosavybės taisykles naudodama skolintis tikrintojas. Skolinimosi tikrintuvas patikrina nuosavybės modelį ir nusprendžia, ar atmintyje yra reikšmė (
krūva arba krūva) nepatenka į taikymo sritį, ar ne. Jei vertė nepatenka į jos taikymo sritį, ji nepasiekiama kitoms programos dalims, nebent ji pasiskolinta.Nuosavybės taisyklės
Rust kiekvienam kintamajam priklauso reikšmė, su kuria jis inicijuotas, ir gali būti tik vienas savininkas. Kai savininkas nepatenka į taikymo sritį, vertė nukrenta. Svarbu suprasti nuosavybės taisyklių detales.
Pirmoji nuosavybės taisyklė yra ta, kad kiekvienam kintamajam priklauso pradinė vertė.
leisti savininkas = Styga::from("vienas");
The savininkas kintamajam aukščiau priklauso eilutė vienas ir, skirtingai nuo kalbų, pvz., Python ir Go, ši reikšmė bus pašalinta perskiriant kintamąjį.
Antroji nuosavybės taisyklė yra ta, kad du kintamieji negali nurodyti tos pačios atminties vietos; kiekviena vertybė gali turėti tik vieną savininką.
leisti naujas_savininkas = savininkas;
The naujas_savininkas kintamajam dabar priklauso reikšmė, saugoma atminties vietoje savininkas kintamasis. Jei bandysite naudoti savininkas kintamąjį, kompiliatorius ims panikuoti ir atsisakys generuoti vykdomąjį failą.
Daugumoje kalbų, kuriose naudojami šiukšlių surinkėjai, du kintamieji gali nurodyti tą pačią atminties vietą. Štai lygiaverčio „JavaScript“ kodo pavyzdys:
leisti savininkas = "savininkas";
leisti naujas_savininkas = savininkas;
konsolė.log (naujas_savininkas);
Aukščiau pateikto „JavaScript“ kodo paleidimas veikia be klaidų, o jei tą patį padarysite naudodami „Go“ arba „Python“, jūsų programa taip pat veiks be klaidų.
Trečioji nuosavybės taisyklė yra ta, kad kai kintamasis nepatenka į deklaruotą sritį, vertė nukrenta, o atmintis atlaisvinama.
// kintamasis atskiroje srityje
{
leisti pavyzdys = Styga::from("Čia nauja apimtis");
}
spausdinti!("{}", pavyzdys)
Jūs negalite pasiekti pavyzdys kintamasis už jo taikymo srities ribų; bandydami tai padaryti, kompiliatorius sukels paniką.
Nuosavybė funkcijose
Kai funkcijai perduodate reikšmę kaip argumentą, funkcija gali pasiekti tą kintamąjį, net jei jis nebuvo deklaruotas jo taikymo srityje:
fnspausdintuvas(vertė: Styga) -> Styga {
grąžinti vertė
}fnpagrindinis() {
leisti x = Styga::from("Spausdina reikšmę"); // x priklauso eilutės reikšmė
// nuosavybės teisė perkeliama į spausdintuvo funkciją čia
spausdinti!("{} Rezultatas of Printing X yra tai, kad tai -:", spausdintuvas (x));
}
Funkcija gali pasiekti šį kintamąjį, nes „Rust“ perkelia jo nuosavybės teisę funkcijai kompiliavimo metu.
Galbūt manote, kad kintamąjį vis tiek galima naudoti vėliau jo pradine apimtimi:
fnspausdintuvas(vertė: Styga) -> Styga {
grąžinti vertė
}fnpagrindinis() {
leisti x = Styga::from("Spausdina reikšmę");
spausdinti!("{} Rezultatas iš Spausdinimo x yra tai -:", spausdintuvas (x));
// Bandymas naudoti kintamąjį po to, kai buvo perduota nuosavybės teisė į jo vertę
println!("{} neturėtų būti pasiekiamas", x)
}
Bet jei bandysite tai, kompiliatorius panikuotų ir atsisakys sukurti vykdomąjį failą:
Rūdys teikia pirmenybę kodo pakartotiniam naudojimui
Kodo pakartotinis naudojimas yra esminė praktika, tačiau norint praktikuoti kodo pakartotinį naudojimą, reikia suprasti Rust nuosavybės taisykles.
Rust yra labai lanksti programavimo kalba. Jame pateikiamos tokios sąvokos kaip skolinimasis, perkėlimas, kopijavimas ir klonavimas, kad būtų galima kintamą pakartotinį naudojimą.