Rust - Básico - 04 - Propiedad

Propiedad

Comprensión

En los datos del heap, let b = a; hace una copia superficial y a deja de ser válida: ocurre un move. Para copiar profundamente hay que escribir let b = a.clone();, y entonces a sigue siendo accesible. Si un parámetro de función es String, el valor se mueve; si usamos una referencia (&String), no se mueve. Crear una referencia se llama borrowing (préstamo). Para modificarla, el parámetro debe ser &mut String. En un mismo momento solo puede existir una referencia &mut a unos datos, o varias referencias inmutables &. No se permite mezclar referencias mutables e inmutables en el mismo alcance. El compilador garantiza que las referencias sean válidas, por lo que no hay referencias colgantes .

Fuente

https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html Rust tiene el trait Copy, que puede aplicarse a tipos almacenados en la pila, como los enteros. Si un tipo implementa Copy, la variable original sigue siendo utilizable después de una asignación. Los tipos que implementan Drop no pueden implementar Copy. En general, los valores escalares simples pueden implementar Copy; los recursos que requieren asignación no. Entre ellos están los enteros, bool, los flotantes, char y las tuplas cuyos elementos también implementen Copy.

let mut s = String::from("hello");
let r1 = &mut s;
let r2 = &mut s;
println!("{}, {}", r1, r2);

Este código es inválido porque no podemos tomar más de un préstamo mutable a la vez. Los bloques permiten varios préstamos mutables, siempre que no sean simultáneos:

let mut s = String::from("hello");
{
    let r1 = &mut s;
}
let r2 = &mut s;

Tampoco podemos tener una referencia mutable mientras existen referencias inmutables. Varias referencias inmutables sí son correctas. El alcance de una referencia llega hasta su último uso.

Reglas de las referencias

  • En cualquier momento puedes tener una referencia mutable o cualquier cantidad de referencias inmutables.
  • Las referencias siempre deben ser válidas.