Movimientos en llamadas de función
Cuando pasas un valor a una función, el valor se asigna al parámetro de la función. Esta acción transfiere el ownership:
fn say_hello(name: String) { println!("Hello {name}") } fn main() { let name = String::from("Alice"); say_hello(name); // say_hello(name); }
- Con la primera llamada a 
say_hello,maindeja de tener el ownership dename. Después, ya no se podrá usarnamedentro demain. - La memoria de heap asignada a 
namese liberará al final de la funciónsay_hello. - main
podrá conservar el _ownership_ si pasanamecomo referencia (&name) y sisay_hello` acepta una referencia como parámetro. - Por otro lado, 
mainpuede pasar un clon denameen la primera llamada (name.clone()). - Rust hace que resulte más difícil que en C++ crear copias por error al definir la semántica de movimiento como predeterminada y al obligar a los programadores a clonar sólo de forma explícita.