Capítulo 11: Enums e Match Avançado 🛡️🔮
Neste capítulo, vamos aprender sobre as Enums do Rust, que são muito mais poderosas que em outras linguagens, com o tema Zelda!
📖 O que são Enums em Rust?
Uma enum (enumeração) permite criar um tipo que pode ser um de vários valores possíveis. No Rust, as enums podem até guardar dados dentro de cada variante! Isso as torna perfeitas para representar estados de jogo ou itens diferentes.
📖 Exemplo Guiado: Itens do Inventário
Vamos criar uma enum para representar diferentes tipos de itens que o Link pode carregar.
- Crie o arquivo
itens_zelda.rsna pastasrc/:
// Definindo a Enum. Repare que cada variante pode guardar dados diferentes!
enum Item {
Espada(i32), // Guarda o poder de ataque
Escudo(bool), // Guarda se é resistente a fogo
Pocao(String), // Guarda o nome da poção
}
fn usar_item(item: Item) {
// O match é obrigatório para extrair os dados da enum!
match item {
Item::Espada(poder) => println!("Voce atacou com a espada! Dano: {}", poder),
Item::Escudo(fogo) => {
if fogo {
println!("Voce bloqueou com o escudo de fogo!");
} else {
println!("Voce bloqueou com o escudo normal.");
}
}
Item::Pocao(nome) => println!("Voce bebeu a pocao de: {}", nome),
}
}
fn main() {
let item1 = Item::Espada(50);
let item2 = Item::Escudo(true);
let item3 = Item::Pocao(String::from("Vida"));
println!("--- Usando Itens ---");
usar_item(item1);
usar_item(item2);
usar_item(item3);
}🕹️ Como Executar e Testar no VS Code
- Abra o terminal integrado.
- Compile:
rustc itens_zelda.rs - Execute:
./itens_zelda
Resultado Esperado:
--- Usando Itens ---
Voce atacou com a espada! Dano: 50
Voce bloqueou com o escudo de fogo!
Voce bebeu a pocao de: Vida📊 Ilustração Visual: Enum com Dados
Veja como cada variante carrega seu próprio tipo de dado:
graph TD A[Enum: Item] --> B["Variante: Espada (i32)"] A --> C["Variante: Escudo (bool)"] A --> D["Variante: Pocao (String)"]
🛠️ Prática Obrigatória 1: Estados do Personagem
Crie um programa chamado estados_jogo.rs com uma enum Estado que tenha as variantes: Parado, Correndo(i32) (guarda a velocidade) e Atacando(String) (guarda o nome do golpe). Crie uma função que use match para exibir uma mensagem para cada estado!
🔑 Gabarito de Código
Prática 1: estados_jogo.rs
enum Estado {
Parado,
Correndo(i32),
Atacando(String),
}
fn mostrar_estado(e: Estado) {
match e {
Estado::Parado => println!("O heroi esta parado."),
Estado::Correndo(vel) => println!("O heroi esta correndo a {} km/h!", vel),
Estado::Atacando(golpe) => println!("O heroi usou o golpe: {}", golpe),
}
}
fn main() {
let e1 = Estado::Parado;
let e2 = Estado::Correndo(20);
let e3 = Estado::Atacando(String::from("Kamehameha"));
mostrar_estado(e1);
mostrar_estado(e2);
mostrar_estado(e3);
}