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 a s2 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).