Semántica de movimiento
Una asignación transferirá su ownership entre variables:
fn main() { let s1: String = String::from("Hola!"); let s2: String = s1; println!("s2: {s2}"); // println!("s1: {s1}"); }
- La asignación de
s1
as2
transfiere el ownership. - Cuando
s1
queda fuera del ámbito, no ocurre nada: no le pertenece nada. - Cuando
s2
sale del ámbito, los datos de la cadena se liberan. - Siempre hay exactamente un enlace a variable que posee un valor.
-
Menciona que es lo contrario de los valores predeterminados de C++, que se copian por valor, a menos que utilices
std::move
(y que el constructor de movimiento esté definido). -
Es únicamente el ownership el que se mueve. Si se genera algún código máquina para manipular los datos en sí, se trata de una cuestión de optimización, y esas copias se optimizan de forma agresiva.
-
Los valores simples (como los enteros) se pueden marcar como
Copy
(consulta las diapositivas posteriores). -
En Rust, la clonación es explícita (usando
clone
).