Capítulo 09: O Segredo do Rust - Ownership (Posse) 🕶️💊

Neste capítulo, vamos entrar no conceito mais importante e único do Rust: o Ownership (Posse) e o Borrowing (Empréstimo). Vamos usar o tema Matrix para entender como o Rust gerencia a memória com total segurança!


📖 O que é Ownership?

No Rust, para garantir que a memória seja segura sem precisar de um Garbage Collector, existem 3 regras de ouro:

  1. Cada valor no Rust tem uma variável que é chamada de seu dono (owner).
  2. Só pode haver um dono de cada vez.
  3. Quando o dono sai de escopo (fim do bloco), o valor é jogado fora (memória liberada).

📖 Exemplo Guiado: O Arquivo do Neo (Move)

Se você tentar passar uma String para outra variável, o Rust “move” a posse! A variável antiga deixa de existir!

  1. Crie o arquivo matrix_move.rs na pasta src/:
fn main() {
    let neo = String::from("Thomas Anderson"); // neo é o dono da String
 
    let escolhido = neo; // A posse foi MOVIDA para 'escolhido'!
 
    // O código abaixo daria ERRO porque 'neo' não é mais dono de nada!
    // println!("Nome antigo: {}", neo); 
 
    println!("O Escolhido e: {}", escolhido);
}

🕹️ Como Executar e Testar no VS Code

  1. Abra le terminal integrado.
  2. Compile: rustc matrix_move.rs
  3. Execute: ./matrix_move

Resultado Esperado:

O Escolhido e: Thomas Anderson

📖 Recurso Rust: Borrowing (Empréstimo com &)

E se quisermos apenas USAR o valor sem tirar a posse do dono? Usamos o caractere & para emprestar (borrowing)!

fn main() {
    let neo = String::from("Thomas Anderson");
 
    // Passamos uma referência com '&', então a posse continua com 'neo'
    exibir_nome(&neo); 
 
    println!("Ainda lembro do nome: {}", neo); // Funciona!
}
 
fn exibir_nome(nome: &String) {
    println!("Nome acessado: {}", nome);
}

📊 Ilustração Visual: Ownership vs Borrowing

Veja a diferença entre mover e emprestar:

graph TD
    A["Dono Original: neo"] -->|"Move"| B["Novo Dono: escolhido"]
    C["Dono: neo"] -->|"& Empréstimo"| D["Usuário Temporário"]

🛠️ Prática Obrigatória 1: Emprestando a Pílula

Crie um programa chamado pilula_borrow.rs que tenha uma String chamada pilula com o valor “Vermelha”. Crie uma função chamada analisar_pilula(p: &String) que apenas exiba a cor da pílula. Chame a função passando a referência e depois exiba a pílula novamente na main para provar que ela não foi destruída!


🔑 Gabarito de Código

Prática 1: pilula_borrow.rs

fn analisar_pilula(p: &String) {
    println!("Analisando pilula... Ela e {}", p);
}
 
fn main() {
    let pilula = String::from("Vermelha");
 
    analisar_pilula(&pilula);
 
    println!("Voce ainda tem a pilula {} em maos.", pilula);
}

Capitulo Anterior | Proximo Capitulo