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 diga_ola(nome: String) {
    println!("Olá {nome}")
}

fn main() {
    let nome = String::from("Alice");
    diga_ola(nome);
    // diga_ola(nome);
}
  • 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 nome será liberada no final da função diga_ola.
  • main pode manter a ownership se passar nome como uma referência (&nome) e se diga_ola aceitar uma referência como um parâmetro.
  • Alternativamente, main pode passar um clone de nome na primeira chamada (nome.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.