Rdza - pożyczanie
Przekazanie własności zmiennej do innej funkcji, a następnie zwrócenie własności jest bardzo niewygodne. Rust obsługuje koncepcję pożyczania, w której własność wartości jest tymczasowo przenoszona na jednostkę, a następnie zwracana do pierwotnej jednostki właściciela.
Rozważ następujące -
fn main(){
// a list of nos
let v = vec![10,20,30];
print_vector(v);
println!("{}",v[0]); // this line gives error
}
fn print_vector(x:Vec<i32>){
println!("Inside print_vector function {:?}",x);
}
Funkcja główna wywołuje funkcję print_vector () . Wektor jest przekazywany jako parametr do tej funkcji. Własność wektora jest również przekazywana do funkcji print_vector () z funkcji main () . Powyższy kod spowoduje błąd, jak pokazano poniżej, gdy funkcja main () próbuje uzyskać dostęp do wektora v .
| print_vector(v);
| - value moved here
| println!("{}",v[0]);
| ^ value used here after move
Dzieje się tak, ponieważ zmienna lub wartość nie mogą być już używane przez funkcję, która była jej pierwotnym właścicielem, gdy własność zostanie przeniesiona na inną funkcję.
Co to jest pożyczanie?
Gdy funkcja tymczasowo przenosi kontrolę nad zmienną / wartością do innej funkcji na jakiś czas, nazywa się to pożyczaniem. Osiąga się to poprzez przekazanie odniesienia do zmiennej(& var_name)zamiast przekazywania samej zmiennej / wartości do funkcji. Własność zmiennej / wartości przechodzi na pierwotnego właściciela zmiennej po zakończeniu wykonywania funkcji, do której przekazano kontrolę.
fn main(){
// a list of nos
let v = vec![10,20,30];
print_vector(&v); // passing reference
println!("Printing the value from main() v[0]={}",v[0]);
}
fn print_vector(x:&Vec<i32>){
println!("Inside print_vector function {:?}",x);
}
Wynik
Inside print_vector function [10, 20, 30]
Printing the value from main() v[0] = 10
Zmienne odniesienia
Funkcja może modyfikować pożyczony zasób, używając zmiennego odwołania do takiego zasobu. Zmienne odwołanie jest poprzedzone przedrostkiem&mut. Zmienne odwołania mogą działać tylko na zmiennych zmiennych.
Ilustracja: Mutowanie odwołania w postaci liczby całkowitej
fn add_one(e: &mut i32) {
*e+= 1;
}
fn main() {
let mut i = 3;
add_one(&mut i);
println!("{}", i);
}
Funkcja main () deklaruje mutowalną zmienną całkowitą i i przekazuje zmienną referencję do i doadd_one(). Add_one () zwiększa wartość zmiennej i o jeden.
Ilustracja: Mutowanie odwołania do łańcucha
fn main() {
let mut name:String = String::from("TutorialsPoint");
display(&mut name);
//pass a mutable reference of name
println!("The value of name after modification is:{}",name);
}
fn display(param_name:&mut String){
println!("param_name value is :{}",param_name);
param_name.push_str(" Rocks");
//Modify the actual string,name
}
Funkcja main () przekazuje modyfikowalne odwołanie do nazwy zmiennej do funkcji display () . Funkcja wyświetlania dołącza dodatkowy ciąg do oryginalnej zmiennej nazwy .
Wynik
param_name value is :TutorialsPoint
The value of name after modification is:TutorialsPoint Rocks