Da trilha de Rust Este conceito ainda não saiu como card do dia. ir para o card de hoje

Rust Tipos Básico

Structs

Em Rust, uma struct é uma forma de agrupar valores relacionados em um único tipo personalizado. Diferente de tuplas, cada campo tem um nome, o que torna o código mais legível e seguro. Structs são a base para modelar dados do mundo real, como um ponto no plano cartesiano ou um usuário com nome e idade.

Para adicionar comportamento a uma struct, usamos blocos impl. Dentro deles, definimos métodos (funções que recebem self como primeiro parâmetro) e funções associadas (funções que não recebem self e geralmente são usadas como construtoras, como Ponto::new(x, y)).

Além das structs com campos nomeados, Rust oferece tuple structs, que são úteis quando os nomes dos campos não são essenciais, mas ainda queremos um tipo distinto. Por exemplo, struct Cor(u8, u8, u8); cria um tipo Cor que não pode ser confundido com uma tupla comum.

Neste card, vamos explorar a definição de structs, como implementar métodos e funções associadas, e quando usar tuple structs. Tudo isso com exemplos práticos e exercícios para fixar.

Pontos-chave

  • Structs agrupam dados relacionados com campos nomeados, melhorando a legibilidade.
  • Blocos impl permitem adicionar métodos e funções associadas a uma struct.
  • Métodos recebem &self (ou &mut self) e são chamados com instancia.metodo().
  • Funções associadas não recebem self e são chamadas com Tipo::funcao().
  • Tuple structs são úteis para criar tipos distintos sem nomear campos.
structs.rs
// Definição de uma struct com campos nomeados
struct Ponto {
    x: f64,
    y: f64,
}

// Bloco impl: métodos e funções associadas
impl Ponto {
    // Função associada (construtora)
    fn new(x: f64, y: f64) -> Self {
        Ponto { x, y }
    }

    // Método que calcula a distância à origem
    fn distancia_origem(&self) -> f64 {
        (self.x * self.x + self.y * self.y).sqrt()
    }

    // Método que move o ponto
    fn mover(&mut self, dx: f64, dy: f64) {
        self.x += dx;
        self.y += dy;
    }
}

// Tuple struct para representar uma cor RGB
struct Cor(u8, u8, u8);

fn main() {
    // Criando instância com função associada
    let mut p = Ponto::new(3.0, 4.0);
    println!("Ponto: ({}, {})", p.x, p.y);
    println!("Distância à origem: {:.2}", p.distancia_origem());

    p.mover(1.0, -2.0);
    println!("Após mover: ({}, {})", p.x, p.y);

    // Usando tuple struct
    let vermelho = Cor(255, 0, 0);
    println!("Vermelho: R={}, G={}, B={}", vermelho.0, vermelho.1, vermelho.2);
}

Exercícios

  1. 1
    Fácil

    Criando e exibindo uma struct

    Defina uma struct Livro com os campos titulo (String) e ano (u32). No main, crie uma instância e imprima o título e o ano.

    Resolver
  2. 2
    Médio

    Métodos e funções associadas

    Crie uma struct Retangulo com campos largura e altura (f64). Implemente uma função associada new que recebe largura e altura e retorna um Retangulo. Implemente métodos area e perimetro. No main, crie um retângulo e imprima sua área e perímetro.

    Resolver
  3. 3
    Desafio

    Tuple struct e métodos

    Defina uma tuple struct Ponto3D que armazena três coordenadas f64. Implemente uma função associada new e um método distancia_origem que retorna a distância euclidiana à origem. No main, crie dois pontos, imprima a distância de cada um à origem e a distância entre eles.

    Resolver

Continue estudando