Очень неудобно передавать владение переменной другой функции, а затем возвращать владение. Rust поддерживает концепцию заимствования, когда право собственности на стоимость временно передается сущности, а затем возвращается первоначальному владельцу сущности.
Рассмотрим следующее —
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); }
Основная функция вызывает функцию print_vector () . Вектор передается в качестве параметра этой функции. Владение вектором также передается функции print_vector () из main () . Приведенный выше код приведет к ошибке, как показано ниже, когда функция main () пытается получить доступ к вектору v .
| print_vector(v); | - value moved here | println!("{}",v[0]); | ^ value used here after move
Это связано с тем, что переменная или значение больше не могут использоваться функцией, которой она изначально принадлежала, после передачи права собственности на другую функцию.
Что такое заимствование?
Когда функция временно передает контроль над переменной / значением другой функции, это называется заимствованием. Это достигается передачей ссылки на переменную (& var_name) вместо передачи самой переменной / значения в функцию. Владение переменной / значением передается первоначальному владельцу переменной после завершения выполнения функции, которой был передан элемент управления.
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); }
Выход
Inside print_vector function [10, 20, 30] Printing the value from main() v[0] = 10
Изменчивые ссылки
Функция может изменить заемный ресурс, используя изменяемую ссылку на такой ресурс. Изменяемая ссылка имеет префикс & mut . Изменяемые ссылки могут работать только с изменяемыми переменными.
Иллюстрация: мутация целочисленной ссылки
fn add_one(e: &mut i32) { *e+= 1; } fn main() { let mut i = 3; add_one(&mut i); println!("{}", i); }
Функция main () объявляет изменяемую целочисленную переменную i и передает изменяемую ссылку i в add_one () . Add_one () увеличивает значение переменной i на единицу.
Иллюстрация: отключение ссылки на строку
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 }
Функция main () передает изменяемую ссылку имени переменной в функцию display () . Функция отображения добавляет дополнительную строку к исходной переменной имени .