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
,main
deja de tener el ownership dename
. Después, ya no se podrá usarname
dentro demain
. - La memoria de heap asignada a
name
se liberará al final de la funciónsay_hello
. - main
podrá conservar el _ownership_ si pasa
namecomo referencia (
&name) y si
say_hello` acepta una referencia como parámetro. - Por otro lado,
main
puede pasar un clon dename
en 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.