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:
- Cada valor no Rust tem uma variável que é chamada de seu dono (owner).
- Só pode haver um dono de cada vez.
- 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!
- Crie o arquivo
matrix_move.rsna pastasrc/:
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
- Abra le terminal integrado.
- Compile:
rustc matrix_move.rs - 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);
}