Учебники

Руст — Заимствование

Очень неудобно передавать владение переменной другой функции, а затем возвращать владение. 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 () . Функция отображения добавляет дополнительную строку к исходной переменной имени .