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.

  1. Crie o arquivo itens_zelda.rs na pasta src/:
// 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

  1. Abra o terminal integrado.
  2. Compile: rustc itens_zelda.rs
  3. 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);
}

Capitulo Anterior | Proximo Capitulo