Rust kasutab oma omandireeglite jõustamiseks ja programmide mälukindluse tagamiseks laenukontrolli. Omandiõiguse reeglid määravad, kuidas Rust pinu ja hunniku mälu haldab.
Rust-programme kirjutades peate kasutama muutujaid ilma seotud väärtuse omandiõigust muutmata. Rust pakub tugevat laenumehhanismi, mis soodustab paindlikkust ja koodi taaskasutamist.
Mis on laenamine roostes?
Laenamine on muutuja väärtusele juurdepääs ilma muutuja omandiõiguse võtmine omanikule viidates. Laenamise kontrollija tagab, et viide on kehtiv ja andmeid ei jäeta kõrvale, kasutades konstruktsiooni nimega eluiga.
Eluiga on see, kui kaua muutuja eksisteerib. Eluiga algab muutuja loomisest ja lõpeb muutuja hävitamisega. Saate laenata muutuja omandiõigust ja kui laenatud viide on väljaspool ulatust, naaseb omandiõigus omaniku muutujale. Laenamine on natuke nagu näpunäiteid, mida leiate sellistes keeltes nagu C++ ja Go. Kuid Rusti kompilaator kasutab programmide mälukindluse tagamiseks laenukontrolli.
Näide laenamisest roostes
Muutuja omandiõiguse saate laenata, viidates omanikule sümboliga ampersand (&).
fnpeamine() {
lase x = String::from("tere"); // x omab "tere"
lase y = &x; // y viitab x-ile, laenab "tere"
println!("{}", x);
println!("{}", y)
}
Ilma viitamise teel laenamata satuks programm paanikasse. See rikuks omandireeglit, et väärtusel võib olla üks omanik ja kaks muutujat ei saa osutada samale mälukohale. Laenamine võib olla funktsioonides väga kasulik. Siin on näide funktsiooni laenamisest, et säilitada omandiõigus, kutsudes samal ajal teisi funktsioone, mis võtavad argumentidena kohalikke muutujaid.
fnprint_even(vektor: &Vec<i32>) {
jaoks väärtused sisse vectr {
kui väärtused % 2 == 0 {
println!("{}", väärtused);
}
}
}
The print_even funktsioon viitab oma argumendina 32-bitiste täisarvude vektorile. Seejärel prindib see väärtuste read, mis on vektoris kahekordsed, kasutades for-tsüklit ja println! makro.
fnpeamine() {
lase arv_vektor = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
print_paaris(&number_vektor); // omandiõigus on laenatud, mitte teisaldatud
println!("Põhifunktsioon säilitab omandiõiguse numbrivektorile{:?}", number_vector)
}
Põhifunktsioon deklareerib muutuja number_vector ja määrab sellele 32-bitiste täisarvude vektori. Seejärel kutsub see välja funktsiooni print_even ja edastab sellele viite number_vektor muutuja, kasutades ampersandi sümbolit.
Põhifunktsioon säilitab omandiõiguse number_vektor muutuja võib jätkata väärtuse kasutamist oma mälukohas.
Viidete laenamine ja muutmine
Funktsioonid võivad enne omandiõiguse tagastamist muuta ka laenatud muutujaid, kasutades neile muutuvaid viiteid.
Kuid erinevalt tavalistest muutujatest, mida saab võtmesõna mut abil muuta muutlikuks, peate muudetavate viidete ees lisama ampersandi sümboli.
Enne muudetavate viidete tegemist peab muutuja, mida soovite muuta, olema muudetav.
fneemalda_väärtus(vektor: &mutVec<i32>) -> &Vec<i32> {
vectr.remove(4);
tagasi vektor
}
The eemalda_väärtus funktsioon võtab 32-bitiste täisarvude muutuva vektori viite. See tagastab 32-bitiste täisarvude vektori pärast vektori väärtuse eemaldamist neljandas indeksis.
fnpeamine() {
lasemut numbrid = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
remove_value(&mut numbrid); // siin on muutuv viide
println!("{:?}", numbrid);
}
Funktsioon muudab numbrid vektorit, kutsudes välja käsu remove_value ja edastades argumendina vektori muutuva viite. Vektori printimisel vektori eelmist neljandat indeksit ei eksisteeri.
Pange tähele, et argument on viide muutuvale vektorile.
Oluline on mõista omandiõigust ja laenamist
Peate mõistma omandiõigust ja laenamist, et kirjutada tõhusat, mälukindlat Rust-koodi, mis kompileerib ja töötab. Kui teie kood ei vasta omandireeglitele, tuvastab laenukontrollija selle. Peate oma programmi muutma mälukindlaks, et Rust saaks selle kompileerida.
Laenamise kontrollija on tüütu, kui olete Rust uus. Kuid kui kirjutate rohkem Rust-koodi, harjute sellega ja omandate kogemusi mälukindla Rust-koodi kirjutamisel.