Capítulo 10: Estruturas (Structs) 🤖🌆

Neste capítulo, vamos aprender a criar nossos próprios tipos de dados compostos usando as Structs no Rust, com o tema Cyberpunk 2077!


📖 O que são Structs?

Uma struct (estrutura) permite agrupar variáveis de tipos diferentes sob um único nome. No Rust, não temos classes! Usamos structs combinadas com blocos impl para adicionar comportamentos (métodos).


📖 Exemplo Guiado: Registro de Mercenário

Vamos criar uma estrutura para representar um Mercenário de Night City.

  1. Crie o arquivo mercenario.rs na pasta src/:
// Definindo a estrutura
struct Mercenario {
    apelido: String,
    nivel: i32,
    cibernetica: f32, // Porcentagem de implantes
}
 
// Bloco de implementação para adicionar métodos
impl Mercenario {
    fn exibir_status(&self) { // '&self' serve para acessar os dados da própria struct
        println!("--- Registro de Night City ---");
        println!("Apelido: {}", self.apelido);
        println!("Nivel: {}", self.nivel);
        println!("Implantes: {}%", self.cibernetica);
    }
}
 
fn main() {
    // Criando uma instância da struct
    let v = Mercenario {
        apelido: String::from("V"),
        nivel: 50,
        cibernetica: 75.5,
    };
 
    // Chamando o método
    v.exibir_status();
}

🕹️ Como Executar e Testar no VS Code

  1. Abra o terminal integrado.
  2. Compile: rustc mercenario.rs
  3. Execute: ./mercenario

Resultado Esperado:

--- Registro de Night City ---
Apelido: V
Nivel: 50
Implantes: 75.5%

📊 Ilustração Visual: Estrutura e Métodos

Veja como os dados e funções ficam agrupados:

classDiagram
    class Mercenario {
        +String apelido
        +i32 nivel
        +f32 cibernetica
        +exibir_status()
    }

🛠️ Prática Obrigatória 1: Cadastro de Ciborgue

Crie um programa chamado cadastro_ciborgue.rs com uma struct Ciborgue que tenha os campos modelo (String), bateria (i32) e ativo (bool). Crie um método exibir() no bloco impl para mostrar os dados formatados.


🔑 Gabarito de Código

Prática 1: cadastro_ciborgue.rs

struct Ciborgue {
    modelo: String,
    bateria: i32,
    ativo: bool,
}
 
impl Ciborgue {
    fn exibir(&self) {
        println!("\n--- Ciborgue Cadastrado ---");
        println!("Modelo: {}", self.modelo);
        println!("Bateria: {}%", self.bateria);
        println!("Status: {}", if self.ativo { "Ativo" } else { "Inativo" });
    }
}
 
fn main() {
    let c = Ciborgue {
        modelo: String::from("T-800"),
        bateria: 100,
        ativo: true,
    };
 
    c.exibir();
}

Capitulo Anterior | Proximo Capitulo