Programmeringssprog adskiller sig i, hvordan de håndterer hukommelse og håndhæver regler for hukommelsesstyring. Go og Python ansætter skraldesamlere, så udviklere kan fokusere på at skrive kode. C og C++ giver programmører ansvaret for at styre hukommelsen på et lavere niveau.

Rust behandler hukommelseshåndtering anderledes ved at bruge begreber, det kalder ejerskab og lån. Den bruger en "lånekontrol" til at håndhæve hukommelsessikkerheden effektivt.

Hvad er ejerskab?

Ejerskab er en funktion og konvention i Rust, der hjælper med at sikre hukommelsessikkerheden for programmer uden en skraldeopsamler. Det er en anden måde at tackle på problemet med hukommelseslækager i din kode.

Rust-kompileren tjekker, om et program overholder ejerskabsreglerne på kompileringstidspunktet. Hvis programmet følger disse regler, kan det køre. Hvis det ikke gør det, nægter compileren at producere en eksekverbar.

Rust verificerer ejerskabsreglerne ved hjælp af låne checker. Lånekontrollen verificerer ejerskabsmodellen og beslutter, om en værdi i hukommelsen (

stak eller bunke) er uden for rækkevidde eller ej. Hvis en værdi er uden for dens omfang, er den ikke tilgængelig for andre dele af programmet, medmindre den er lånt.

Ejerskabsreglerne

I Rust ejer hver variabel værdien, den er initialiseret med, og der kan kun være én ejer. Når ejeren er uden for rækkevidde, falder værdien. Det er vigtigt at forstå detaljerne i ejerskabsreglerne.

Den første ejerskabsregel er, at hver variabel ejer sin initialiserede værdi.

lade ejer = Snor::fra en");

Det ejer variabel ovenfor ejer strengen en og i modsætning til sprog som Python og Go, vil denne værdi blive droppet ved variabel omfordeling.

Den anden ejerregel er, at to variabler ikke kan pege på den samme hukommelsesplacering; hver værdi kan kun have én ejer.

lade ny_ejer = ejer;

Det ny_ejer variabel ejer nu værdien, der er gemt på hukommelsesplaceringen af ejer variabel. Hvis du prøver at bruge ejer variabel, vil compileren gå i panik, og den vil nægte at generere en eksekverbar.

På de fleste sprog, der bruger skraldeopsamlere, kan to variabler pege på den samme hukommelsesplacering. Her er et eksempel på tilsvarende JavaScript-kode:

lade ejer = "ejer";
lade ny_ejer = ejer;
konsol.log (ny_ejer);

At køre JavaScript-koden ovenfor fungerer uden fejl, og hvis du gør det samme i Go eller Python, vil dit program også fungere uden fejl.

Den tredje ejerskabsregel er, at når en variabel er uden for det erklærede omfang, bliver værdien droppet, og hukommelsen deallokeres.

// en variabel i et separat omfang
{
lade eksempel = Snor::from("Her er et nyt omfang");
}

Print!("{}", eksempel)

Du kan ikke få adgang til eksempel variabel uden for dens anvendelsesområde; forsøg på at gøre det vil få compileren til at gå i panik.

Ejerskab i funktioner

Når du sender en værdi til en funktion som et argument, kan funktionen få adgang til denne variabel, selvom den ikke blev erklæret i sit omfang:

fnprinter(værdi: Snor) -> Snor {
Vend tilbage værdi
}

fnvigtigste() {
lade x = Snor::from("Udskriver en værdi"); // x ejer strengværdien

// ejerskab flyttes til printerfunktionen her
Print!("{} Det Resultat af Udskrivning X er, at det -:", printer (x));
}

Funktionen kan få adgang til denne variabel, fordi Rust flytter ejerskabet af den til funktionen på kompileringstidspunktet.

Du tror måske, at det stadig er muligt at bruge variablen senere i dets oprindelige omfang:

fnprinter(værdi: Snor) -> Snor {
Vend tilbage værdi
}

fnvigtigste() {
lade x = Snor::from("Udskriver en værdi");
Print!("{} Det Resultat af Udskrivning x er, at det -:", printer (x));

// Forsøger at bruge variablen efter at ejendomsretten til dens værdi er blevet overført
println!("{} burde ikke være tilgængelig", x)
}

Men hvis du prøver dette, vil compileren gå i panik og nægte at producere en eksekverbar:

Rust prioriterer genbrug af kode

Kodegenanvendelighed er en væsentlig praksis, men for at praktisere kodegenanvendelighed skal du forstå Rusts ejerskabsregler.

Rust er et meget fleksibelt programmeringssprog. Det giver begreber som lån, flytning, kopiering og kloning af ejerskab til variabel genanvendelighed.