Iniciante Fundamentos

Ownership

Ownership (posse) é o recurso central do Rust que garante segurança de memória sem coletor de lixo. As regras são verificadas em tempo de compilação.

As três regras

  • Cada valor tem um único dono (owner).
  • Só pode haver um dono por vez.
  • Quando o dono sai de escopo, o valor é liberado.

Liberação automática

Quando a variável dona sai de escopo, a memória é liberada automaticamente.

fn main() {
    {
        let s = String::from("olá"); // 's' é dona
        println!("{}", s);
    } // aqui 's' sai de escopo e a memória é liberada
}

Move

Ao atribuir uma String a outra variável, a posse é movida. A antiga deixa de ser válida.

fn main() {
    let s1 = String::from("texto");
    let s2 = s1; // posse movida para s2
    // println!("{}", s1); // ERRO: s1 não é mais válida
    println!("{}", s2);
}

Tipos simples são copiados

Tipos escalares (como i32) implementam Copy, então são copiados, não movidos.

fn main() {
    let a = 5;
    let b = a; // cópia
    println!("{} {}", a, b); // ambos válidos
}

Passar para função também move

fn consumir(s: String) {
    println!("{}", s);
}

fn main() {
    let texto = String::from("oi");
    consumir(texto); // posse movida para a função
    // texto não é mais válido aqui
}