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

Rust Módulos Intermediário

Módulos e crates

Em Rust, módulos (mod) organizam o código em namespaces hierárquicos, permitindo agrupar funcionalidades relacionadas e controlar a visibilidade com pub. Um crate é a unidade de compilação: pode ser um binário ou uma biblioteca, e sua configuração fica no Cargo.toml, que define dependências e metadados.

A organização de pastas segue uma convenção: o arquivo src/main.rs é o ponto de entrada de um binário, enquanto src/lib.rs define uma biblioteca. Módulos podem ser declarados em arquivos separados (ex.: src/geometria.rs) ou em diretórios com mod.rs (ex.: src/geometria/mod.rs). O caminho dos módulos reflete a estrutura de arquivos.

A palavra-chave pub torna itens visíveis fora do módulo. Sem ela, funções, structs e campos são privados por padrão. O use traz itens para o escopo atual, evitando caminhos longos. É comum usar use crate::modulo::item; ou use self::submodulo::funcao;.

Neste card, você verá como criar e usar módulos, expor itens com pub, configurar um crate no Cargo.toml e organizar arquivos e pastas de forma idiomática.

Pontos-chave

  • mod declara um módulo; pub torna itens públicos; use encurta caminhos.
  • O Cargo.toml define o nome do crate, versão, dependências e pontos de entrada.
  • A estrutura de pastas deve espelhar a hierarquia de módulos: src/nome_mod.rs ou src/nome_mod/mod.rs.
  • Itens são privados por padrão; para acessá-los de fora, use pub em cada nível do caminho.
  • crate:: refere-se à raiz do crate atual; super:: e self:: navegam na hierarquia.
src/main.rs
// src/main.rs
mod geometria; // declara o módulo geometria (arquivo src/geometria.rs)

use geometria::formas::Retangulo; // traz Retangulo para o escopo

fn main() {
    let r = Retangulo::new(3.0, 4.0);
    println!("Área: {}", r.area());
    println!("Perímetro: {}", r.perimetro());
}

// src/geometria.rs
// pub mod formas; // se fosse um diretório, mas aqui é o próprio arquivo
pub mod formas {
    pub struct Retangulo {
        pub largura: f64,
        pub altura: f64,
    }

    impl Retangulo {
        pub fn new(largura: f64, altura: f64) -> Self {
            Retangulo { largura, altura }
        }

        pub fn area(&self) -> f64 {
            self.largura * self.altura
        }

        pub fn perimetro(&self) -> f64 {
            2.0 * (self.largura + self.altura)
        }
    }
}

// Cargo.toml (exemplo)
// [package]
// name = "meu_crate"
// version = "0.1.0"
// edition = "2021"
//
// [dependencies]
// # nenhuma dependência externa neste exemplo

Exercícios

  1. 1
    Fácil

    Criando e usando um módulo simples

    Crie um módulo matematica com uma função pública soma que recebe dois inteiros e retorna a soma. No main, chame matematica::soma(2, 3) e imprima o resultado.

    Resolver
  2. 2
    Médio

    Organizando em arquivos separados

    Crie um crate binário com dois módulos em arquivos separados: saudacoes.rs com uma função pub fn ola(nome: &str) -> String que retorna "Olá, {nome}!", e despedidas.rs com pub fn tchau(nome: &str) -> String que retorna "Tchau, {nome}!". No main.rs, declare os módulos e use as funções para imprimir as mensagens para o nome "Rust".

    Resolver
  3. 3
    Desafio

    Módulos aninhados e controle de visibilidade

    Crie um crate binário com a seguinte estrutura de módulos:

    • src/main.rs declara mod util; e mod app;.
    • src/util.rs contém um submódulo matematica com uma função pub fn dobro(x: i32) -> i32 e uma função pub(crate) fn triplo(x: i32) -> i32. O módulo matematica deve ser público.
    • src/app.rs contém uma função pub fn executar() que usa crate::util::matematica::dobro e crate::util::matematica::triplo para calcular e imprimir o dobro e o triplo de 5.

    No main, chame app::executar(). A função triplo deve ser acessível apenas dentro do crate (use pub(crate)).

    Resolver

Continue estudando