Óxido - Préstamo

Es muy inconveniente pasar la propiedad de una variable a otra función y luego devolver la propiedad. Rust respalda un concepto, el préstamo, en el que la propiedad de un valor se transfiere temporalmente a una entidad y luego se devuelve a la entidad propietaria original.

Considere lo siguiente:

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);
}

La función principal invoca una función print_vector () . Se pasa un vector como parámetro a esta función. La propiedad del vector también se pasa a la función print_vector () desde main () . El código anterior dará como resultado un error como se muestra a continuación cuando la función main () intente acceder al vector v .

|  print_vector(v);
|     - value moved here
|  println!("{}",v[0]);
|     ^ value used here after move

Esto se debe a que la función que originalmente la poseía ya no puede usar una variable o valor una vez que la propiedad se transfiere a otra función.

¿Qué es pedir prestado?

Cuando una función transfiere su control sobre una variable / valor a otra función temporalmente, por un tiempo, se llama préstamo. Esto se logra pasando una referencia a la variable(& var_name)en lugar de pasar la variable / valor en sí a la función. La propiedad de la variable / valor se transfiere al propietario original de la variable después de que la función a la que se pasó el control complete la ejecución.

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);
}

Salida

Inside print_vector function [10, 20, 30]
Printing the value from main() v[0] = 10

Referencias mutables

Una función puede modificar un recurso prestado utilizando una referencia mutable a dicho recurso. Una referencia mutable tiene el prefijo&mut. Las referencias mutables solo pueden operar en variables mutables.

Ilustración: mutación de una referencia entera

fn add_one(e: &mut i32) {
   *e+= 1;
}
fn main() {
   let mut i = 3;
   add_one(&mut i);
   println!("{}", i);
}

La función main () declara una variable entera mutable iy pasa una referencia mutable de i aladd_one(). Add_one () incrementa el valor de la variable i en uno.

Ilustración: mutación de una referencia de cadena

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
}

La función main () pasa una referencia mutable del nombre de la variable a la función display () . La función de visualización agrega una cadena adicional a la variable de nombre original .

Salida

param_name value is :TutorialsPoint
The value of name after modification is:TutorialsPoint Rocks