Ó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