Pular para conteúdo

Aula 08 - Structs e Enums 🏗️

Objetivo

Objetivo: Aprender a definir seus próprios tipos de dados complexos usando Structs e Enums, e entender como o Rust lida com a ausência de valores (null) de forma segura.


1. Structs: Estruturando Dados 🧱

Uma Struct permite agrupar valores relacionados em um único pacote nomeado.

struct Usuario {
    ativo: bool,
    nome: String,
    email: String,
    idade: u64,
}

fn main() {
    let mut user1 = Usuario {
        email: String::from("alguem@exemplo.com"),
        nome: String::from("Ricardo"),
        ativo: true,
        idade: 30,
    };

    user1.email = String::from("novo@exemplo.com");
}

2. Métodos com impl ⚙️

Podemos definir funções que pertencem a uma Struct usando o bloco impl.

struct Retangulo {
    largura: u32,
    altura: u32,
}

impl Retangulo {
    fn area(&self) -> u32 {
        self.largura * self.altura
    }
}

3. Enums: Tipos com Variantes 🌈

Enums permitem definir um tipo que pode ser uma de várias variantes.

enum Direcao {
    Norte,
    Sul,
    Leste,
    Oeste,
}

enum Mensagem {
    Sair,
    Mover { x: i32, y: i32 },
    Escrever(String),
}

4. O Fim do "Null": Option<T> 🛡️

Rust não possui o valor null. Em seu lugar, usamos o Enum Option.

enum Option<T> {
    None,
    Some(T),
}

let algum_numero = Some(5);
let nenhum_numero: Option<i32> = None;

5. Visualização: Pattern Matching com Enums 🧩

graph TD
    A["Valor Option<i32>"] --> B{Dá match?}
    B -->|Some(n)| C["Usa o valor 'n'"]
    B -->|None| D["Trata o caso vazio"]
    style B fill:#f9f,stroke:#333

6. Mini-Projeto: Sistema de Gerenciamento de Tarefas 📝

Crie um programa que defina: 1. Uma Struct Tarefa com campos como titulo, descricao e status. 2. Um Enum Status com variantes: Pendente, EmAndamento, Concluida. 3. Implemente um método na Struct Tarefa para atualizar o status. 4. Use um Vec<Tarefa> para armazenar várias tarefas e um match para exibir mensagens diferentes dependendo do status de cada uma.


7. Exercício de Fixação 🧠

  1. Qual a diferença entre uma Struct e uma Tupla?
  2. Para que serve o parâmetro &self em um método?
  3. Por que o uso de Option<T> é considerado mais seguro que o uso de null em outras linguagens?

Próxima Aula: Vamos aprender a lidar com erros de forma profissional com Tratamento de Erros! ⚠️