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 implementaCopy, la variable original sigue siendo utilizable después de una asignación. Los tipos que implementanDropno pueden implementarCopy. En general, los valores escalares simples pueden implementarCopy; los recursos que requieren asignación no. Entre ellos están los enteros,bool, los flotantes,chary las tuplas cuyos elementos también implementenCopy.
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.