# Prestamos y Referencias
En este tutorial de Rust, aprendemos cómo tomar prestado un valor temporalmente de su propietario, lo que nos permite tener múltiples referencias a ese valor sin romper la propiedad.
También aprendemos cómo hacer referencia a la dirección de memoria de un valor y cómo obtener el valor en esa dirección con el operador de desreferenciación.
# ¿Qué es esto?
Si queremos usar un valor en una función, sin transferir la propiedad a la función, podemos tomar prestado el valor temporalmente de su propietario. Cuando la función se realiza con el valor, se devuelve al propietario.
El préstamo nos permite tener una o más referencias a un mismo valor sin romper el concepto de “propietario único”.
Cuando tomamos prestado un valor, hacemos referencia a su dirección de memoria con el operador &. Una referencia en Rust es una dirección que se pasa a una función como argumento.
TIP
- Si está familiarizado con el lenguaje de programación C, las referencias serían similares a los punteros .
# Cómo hacer referencia y tomar prestado un valor de una variable
Usamos el operador & para hacer referencia a la dirección de memoria de un valor en Rust. Veamos cómo funciona esto con un ejemplo.
fn main() {
let a = String::from("Hola");
// referencia con &
let str_len = get_str_length(&a);
println!("La longitud del String es: {}", str_len);
}
fn get_str_length(s:&String) -> usize {
s.len()
}
En el ejemplo anterior, la variable a es la propietaria de la cadena "Hola". Si usamos la variable en una función, pasará la propiedad a la función. En este caso no queremos eso, por lo que la solución es hacer referencia al propietario ( a ) en su lugar.
En la lista de parámetros de la definición de la función, agregamos el parámetro & antes del tipo para decirle a Rust que el valor entrante será una referencia a un valor, no el valor real. La función solo toma prestado el valor y lo devuelve después de que la función completa su ejecución.
Cuando llamamos a la función, tenemos que agregar el operador & nuevamente, esta vez delante del valor que le pasamos.
# Cómo cambiar un valor prestado
El valor prestado actúa casi como una variable regular, es inmutable. Pero, puede hacerse mutable con la palabra clave mut.
fn main() {
let mut a = 5;
cambiar_valor(&mut a);
println!("{}", a);
}
fn cambiar_valor(num:&mut i32) {
*num = 3;
}
Tenemos que agregar la palabra clave mut a la inicialización de la variable, la definición de la función (en la lista de parámetros) y la llamada a la función.
# Cómo desreferenciar una referencia (recuperar su valor)
Cuando usamos el operador de referencia ( & ), obtenemos la dirección de memoria del valor. Para obtener el valor real en la dirección, usamos el operador de desreferenciación ( * ).
fn main() {
let mut a = 5;
cambiar_valor(&mut a);
println!("{}", a);
}
fn cambiar_valor(num:&mut i32) {
// obtener el valor en la variable num
// utilizando el operador *
*num = 3;
}
En la definición de la función, usamos el operador de desreferenciación para obtener el valor en la dirección de memoria del parámetro y mutarlo.
Resumen
- Podemos tomar prestado un valor temporalmente de su propietario sin transferir la propiedad.
- Una referencia es la dirección de memoria de un valor y se pasa a una función como argumento.
- El operador de referencia es el símbolo &.
- Podemos encontrar el valor en la dirección de memoria con el operador de desreferenciación.
- El operador de desreferencia es el símbolo (*).
- De forma predeterminada, un valor prestado es inmutable, pero podemos hacerlo mutable con la palabra clave mut.