Rust používá nástroj pro kontrolu výpůjček, aby vynutil pravidla vlastnictví a zajistil, že programy jsou bezpečné pro paměť. Pravidla vlastnictví určují, jak Rust spravuje paměť nad zásobníkem a haldou.

Při psaní programů Rust budete muset používat proměnné, aniž byste měnili vlastnictví související hodnoty. Rust poskytuje robustní výpůjční mechanismus, který podporuje flexibilitu a opětovné použití kódu.

Co je půjčování v Rustu?

Výpůjčka je přístup k hodnotě proměnné bez převzetí vlastnictví proměnné odkazem na majitele. Kontrola výpůjček zajišťuje, že reference je platná a data nejsou vypuštěna pomocí konstrukce zvané životnost.

Životnost je doba, po kterou proměnná existuje. Životnost začíná vytvořením proměnné a končí zničením proměnné. Můžete si vypůjčit vlastnictví proměnné, a když je vypůjčená reference mimo rozsah, vlastnictví se vrátí do proměnné vlastníka. Půjčování je trochu jako ukazatele, které najdete v jazycích jako C++ a Go. Kompilátor Rust však používá nástroj pro kontrolu výpůjček, aby zajistil, že programy jsou bezpečné pro paměť.

instagram viewer

Příklad půjčování v rzi

Vlastnictví proměnné si můžete vypůjčit uvedením vlastníka pomocí symbolu ampersand (&).

fnhlavní() {
nechat x = Tětiva::from("ahoj"); // x vlastní "hello"
nechat y = &x; // y odkazuje na x, půjčuje si "ahoj"
println!("{}", X);
println!("{}", y)
}

Bez půjčování pomocí odkazování by program zpanikařil. Porušilo by to pravidlo vlastnictví, že hodnota může mít jednoho vlastníka a dvě proměnné nemohou ukazovat na stejné místo v paměti. Půjčování může být velmi užitečné ve funkcích. Zde je příklad výpůjčky ve funkci, aby se zachovalo vlastnictví při volání jiných funkcí, které berou jako argumenty místní proměnné.

fnprint_even(vectr: &Vec<i32>) {
pro hodnoty v vectr {
-li hodnoty % 2 == 0 {
println!("{}", hodnoty);
}
}
}

The print_even funkce odkazuje na vektor 32bitových celých čísel jako svůj argument. Potom vytiskne řádky hodnot, které jsou násobky dvou ve vektoru pomocí smyčky for a println! makro.

fnhlavní() {
nechat číselný_vektor = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
print_even(&number_vector); // vlastnictví je vypůjčeno, nepřesunuto
println!("Hlavní funkce si zachovává vlastnictví číselného vektoru{:?}", číselný_vektor)
}

Funkce main deklaruje proměnnou number_vector a přiřadí jí vektor 32bitových celých čísel. Poté zavolá funkci print_even a předá jí odkaz na číselný_vektor proměnná pomocí symbolu ampersand.

Hlavní funkce si zachovává vlastnictví číselný_vektor proměnnou může nadále používat hodnotu ve svém paměťovém místě.

Půjčování a mutování referencí

Funkce mohou také upravit vypůjčené proměnné pomocí proměnných odkazů na ně, než vrátí vlastnictví.

Na rozdíl od běžných proměnných, které lze nastavit na proměnlivé pomocí klíčového slova mut, musíte před proměnlivé odkazy uvést symbol ampersand.

Před vytvořením proměnných odkazů musí být proměnná, kterou chcete upravit, proměnná.

fnodebrat_hodnotu(vectr: &mutVec<i32>) -> &Vec<i32> {
vectr.remove(4);
vrátit se vectr
}

The odebrat_hodnotu funkce přebírá odkaz na proměnlivý vektor 32bitových celých čísel. Vrací vektor 32bitových celých čísel po odstranění hodnoty vektoru ve čtvrtém indexu.

fnhlavní() {
nechatmut čísla = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
remove_value(&mut nums); // zde měnitelný odkaz
println!("{:?}", nums);
}

Funkce modifikuje nums vector voláním hodnoty remove_value a předáním proměnného odkazu vektoru jako argumentu. Při tisku vektoru předchozí čtvrtý index vektoru neexistuje.

Všimněte si, že argument je odkaz na proměnlivý vektor.

Je důležité rozumět vlastnictví a půjčování

Abyste mohli psát efektivní, paměťově bezpečný kód Rust, který se zkompiluje a spustí, budete muset rozumět vlastnictví a výpůjčkám. Pokud váš kód neodpovídá pravidlům vlastnictví, kontrola výpůjček to zjistí. Budete muset zajistit, aby byl váš program bezpečný z hlediska paměti, aby jej mohl Rust zkompilovat.

Kontrola výpůjček je otravná, když jste v Rustu noví. Ale jak budete psát více kódu Rust, zvyknete si na to a získáte zkušenosti s psaním kódu Rust bezpečného pro paměť.