Desafio Rust
Módulos aninhados e controle de visibilidade
Enunciado
Crie um crate binário com a seguinte estrutura de módulos:
src/main.rsdeclaramod util;emod app;.src/util.rscontém um submódulomatematicacom uma funçãopub fn dobro(x: i32) -> i32e uma funçãopub(crate) fn triplo(x: i32) -> i32. O módulomatematicadeve ser público.src/app.rscontém uma funçãopub fn executar()que usacrate::util::matematica::dobroecrate::util::matematica::triplopara 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)).
Requisitos
util.rsdeve terpub mod matematicacompub fn dobroepub(crate) fn triplo.app.rsdeve terpub fn executar()que chama as funções deutil::matematica.- O
main.rsdeve declarar os módulos e chamarapp::executar(). - A saída deve mostrar o dobro e o triplo de 5.
Código inicial
// src/main.rs
// TODO: declarar módulos e chamar app::executar()
// src/util.rs
// TODO: criar submódulo matematica com dobro e triplo
// src/app.rs
// TODO: criar função executar
Saída esperada
Dobro: 10
Triplo: 15
Ver dica
Use pub(crate) para triplo e pub para dobro. Em app.rs, importe com use crate::util::matematica::{dobro, triplo};.
Mostrar solução
// src/main.rs
mod util;
mod app;
fn main() {
app::executar();
}
// src/util.rs
pub mod matematica {
// Visível fora do crate
pub fn dobro(x: i32) -> i32 {
x * 2
}
// Visível apenas dentro do crate atual
pub(crate) fn triplo(x: i32) -> i32 {
x * 3
}
}
// src/app.rs
use crate::util::matematica::{dobro, triplo};
pub fn executar() {
let x = 5;
println!("Dobro: {}", dobro(x));
println!("Triplo: {}", triplo(x));
}
Passo a passo
- Em
main.rs, declaramosmod util;emod app;. Isso carrega os arquivossrc/util.rsesrc/app.rscomo módulos. - No
main, chamamosapp::executar(). Comoexecutarépub, ela é acessível a partir da raiz. - Em
util.rs, criamospub mod matematica, um submódulo público. Dentro dele,pub fn dobroé visível em qualquer lugar, epub(crate) fn triploé visível apenas dentro do crate. - Em
app.rs, usamosuse crate::util::matematica::{dobro, triplo};para importar as funções. Ocrate::indica a raiz do crate. - A função
executarchamadobro(5)etriplo(5)e imprime os resultados. - A saída mostra os valores calculados.
Por que funciona
A visibilidade pub(crate) restringe o acesso ao crate atual, impedindo que outros crates usem triplo. Já pub permite exportar dobro para fora. O caminho crate::util::matematica::dobro navega da raiz até o item. O use traz os nomes para o escopo local, simplificando as chamadas. A estrutura de arquivos reflete a hierarquia de módulos: util.rs contém o módulo matematica embutido.
Erros comuns
- Esquecer
pubno módulomatematica:mod matematicasempubtorna o módulo privado, eapp.rsnão consegue acessá-lo. - Usar
pub fn triploem vez depub(crate): isso exporia a função para fora do crate, contrariando o requisito. - Tentar acessar
util::matematica::triplode outro crate: o compilador acusaria que a função é privada. - Não usar
crate::nousedentro deapp.rs:use util::matematica::...pode falhar porqueutilnão está no escopo atual; o correto écrate::util::....
Outra forma de resolver
Colocar o módulo matematica em um arquivo separado src/util/matematica.rs e em src/util.rs declarar pub mod matematica;. Isso é preferível quando o submódulo cresce. Exemplo:
// src/util.rs
pub mod matematica;
// src/util/matematica.rs
pub fn dobro(x: i32) -> i32 { x * 2 }
pub(crate) fn triplo(x: i32) -> i32 { x * 3 }
Saída esperada
Dobro: 10
Triplo: 15