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
moddeclara um módulo;pubtorna itens públicos;useencurta caminhos.- O
Cargo.tomldefine 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.rsousrc/nome_mod/mod.rs. - Itens são privados por padrão; para acessá-los de fora, use
pubem cada nível do caminho. crate::refere-se à raiz do crate atual;super::eself::navegam na hierarquia.
// 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