Rust naudoja skolinimosi tikrintuvą, kad užtikrintų savo nuosavybės taisykles ir užtikrintų, kad programos būtų saugios atmintyje. Nuosavybės taisyklės nustato, kaip Rust tvarko atmintį per krūvą ir krūvą.
Rašydami Rust programas turėsite naudoti kintamuosius nekeičiant susijusios vertės nuosavybės. Rust suteikia tvirtą skolinimosi mechanizmą, skatinantį lankstumą ir pakartotinį kodo naudojimą.
Kas yra skolinimasis rūdyje?
Skolinimasis yra prieiga prie kintamojo vertės be kintamojo nuosavybė nurodant savininką. Pasiskolinimo tikrintuvas užtikrina, kad nuoroda galioja, o duomenys nebūtų atmesti naudojant konstrukciją, vadinamą „lifetimes“.
Gyvenimo trukmė yra tai, kiek laiko egzistuoja kintamasis. Gyvenimo laikas prasideda nuo kintamųjų sukūrimo ir baigiasi kintamųjų sunaikinimu. Galite pasiskolinti kintamojo nuosavybės teisę, o kai pasiskolinta nuoroda nepatenka į taikymo sritį, nuosavybės teisė grąžinama savininko kintamajam. Skolinimasis yra šiek tiek panašus į nuorodas, kurias rasite tokiomis kalbomis kaip C++ ir Go
. Tačiau „Rust“ kompiliatorius naudoja skolinimosi tikrintuvą, kad užtikrintų, jog programos yra saugios atmintyje.Skolinimosi rūdyje pavyzdys
Galite pasiskolinti kintamojo nuosavybės teisę, nurodydami savininką naudodami ampersando (&) simbolį.
fnpagrindinis() {
leisti x = Styga::from("labas"); // x turi "labas"
leisti y = &x; // y nurodo x, skolinasi "labas"
println!("{}", x);
println!("{}", y)
}
Be skolinimosi nuoroda, programa panikuotų. Tai pažeistų nuosavybės taisyklę, kad reikšmė gali turėti vieną savininką, o du kintamieji negali nurodyti tos pačios atminties vietos. Skolinimasis gali būti labai naudingas atliekant funkcijas. Štai pavyzdys, kaip pasiskolinti funkciją, kad būtų išlaikyta nuosavybės teisė ir iškviečiamos kitos funkcijos, kurios kaip argumentus naudoja vietinius kintamuosius.
fnprint_even(vektorius: &Sen<i32>) {
dėl vertybes in vectr {
jeigu vertės % 2 == 0 {
println!("{}", reikšmės);
}
}
}
The print_even funkcija kaip argumentą nurodo 32 bitų sveikųjų skaičių vektorių. Tada jis atspausdina reikšmių eilutes, kurios vektoryje yra dviejų kartotiniai, naudojant for-ciklą ir println! makrokomandą.
fnpagrindinis() {
leisti skaičius_vektorius = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
print_even(&skaiciu_vektorius); // nuosavybė pasiskolinta, o ne perkelta
println!("Pagrindinė funkcija išlaiko nuosavybės teisę į skaičių vektorių{:?}", skaičius_vektorius)
}
Pagrindinė funkcija deklaruoja kintamąjį number_vector ir priskiria jam 32 bitų sveikųjų skaičių vektorių. Tada ji iškviečia funkciją print_even ir perduoda jai nuorodą į skaičius_vektorius kintamasis naudojant ampersando simbolį.
Pagrindinė funkcija išlaiko nuosavybės teisę į skaičius_vektorius kintamąjį, jis gali ir toliau naudoti reikšmę savo atminties vietoje.
Nuorodų skolinimasis ir keitimas
Funkcijos taip pat gali modifikuoti pasiskolintus kintamuosius, naudodamos kintamas nuorodas į juos, prieš grąžindamos nuosavybės teisę.
Tačiau, skirtingai nuo įprastų kintamųjų, kuriuos galima nustatyti į kintamus naudojant raktinį žodį mut, prieš keičiamas nuorodas turite pridėti ampersando simbolį.
Prieš darydami kintamąsias nuorodas, kintamasis, kurį norite keisti, turi būti keičiamas.
fnPašalinti_vertę(vektorius: &mutSen<i32>) -> &Sen<i32> {
vectr.remove(4);
grąžinti vektor
}
The Pašalinti_vertę funkcija perima kintamo 32 bitų sveikųjų skaičių vektoriaus nuorodą. Pašalinus ketvirtojo indekso vektoriaus reikšmę, jis grąžina 32 bitų sveikųjų skaičių vektorių.
fnpagrindinis() {
leistimut numeriai = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
Remove_value(&mut numeriai); // čia keičiama nuoroda
println!("{:?}", numeriai);
}
Funkcija modifikuoja numeriai vektoriaus, iškviečiant remove_value ir perduodant kintamą vektoriaus nuorodą kaip argumentą. Spausdinant vektorių, ankstesnis ketvirtasis vektoriaus indeksas neegzistuoja.
Atkreipkite dėmesį, kad argumentas yra nuoroda į kintamą vektorių.
Svarbu suprasti nuosavybės teisę ir skolinimąsi
Turėsite suprasti nuosavybės teisę ir skolinimąsi, kad galėtumėte parašyti efektyvų, atminties saugų Rust kodą, kuris kompiliuojamas ir paleistas. Jei jūsų kodas neatitinka nuosavybės taisyklių, skolinimosi tikrintuvas jį aptiks. Turėsite užtikrinti, kad programa būtų saugi, kad Rust galėtų ją kompiliuoti.
Pasiskolinimo tikrintuvas erzina, kai esate naujas Rust. Tačiau rašydami daugiau „Rust“ kodo prie jo priprasite ir įgysite atminties saugaus „Rust“ kodo rašymo patirties.