Move em Chamadas de Função

Quando você passa um valor para uma função, o valor é atribuído ao parâmetro da função. Isso transfere a ownership:

fn say_hello(name: String) {
    println!("Olá {name}")
}

fn main() {
    let name = String::from("Alice");
    say_hello(name);
    // say_hello(name);
}
  • Com a primeira chamada para diga_ola, main desiste da ownership de nome. Depois disso, nome não pode mais ser usado dentro de main.
  • A memória do heap alocada para name será liberada no final da função say_hello.
  • main pode manter a ownership se passar nome como uma referência (&name) e se say_hello aceitar uma referência como um parâmetro.
  • Alternativamente, main pode passar um clone de nome na primeira chamada (name.clone()).
  • Rust torna mais difícil a criação de cópias inadvertidamente do que o C++, tornando padrão a semântica de movimento e forçando os programadores a tornar os clones explícitos.