Semântica do Move (mover)
Uma atribuição transferirá o ownership entre variáveis:
fn main() { let s1: String = String::from("Olá!"); let s2: String = s1; println!("s2: {s2}"); // println!("s1: {s1}"); }
- A atribuição de
s1
as2
transfere o ownership. - Quando
s1
sai do escopo, nada acontece: ele não tem ownership. - Quando
s2
sai do escopo, os dados da string são liberados. - Há sempre exatamente uma associação de variável que possui (“owns”) um valor.
-
Mencione que isso é o oposto dos defaults (padrões) em C++, que copia por valor, a menos que você use
std::move
(e seu construtor esteja definido!). -
Apenas o ownership é movido. A geração de código de máquina para manipular os dados é uma questão de otimização, e essas cópias são agressivamente otimizadas.
-
Valores simples (tais como inteiros) podem ser marcados como
Copy
(cópia) (veja slides mais adiante). -
No Rust, clones são explícitos (utilizando-se
clone
).