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 denome
. Depois disso,nome
não pode mais ser usado dentro demain
. - A memória do heap alocada para
nome
será liberada no final da funçãodiga_ola
. main
pode manter a ownership se passarnome
como uma referência (&nome
) e sediga_ola
aceitar uma referência como um parâmetro.- Alternativamente,
main
pode passar um clone denome
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.