Médio Rust

Organizando em arquivos separados

Enunciado

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".

Requisitos

  • Os módulos devem estar em arquivos src/saudacoes.rs e src/despedidas.rs.
  • As funções devem ser públicas e retornar String.
  • O main.rs deve declarar mod saudacoes; e mod despedidas; e chamar as funções.

Código inicial

// src/main.rs
// TODO: declarar os módulos e usar as funções

fn main() {
    // TODO
}

Saída esperada

Olá, Rust!
Tchau, Rust!
Ver dica

Crie os arquivos src/saudacoes.rs e src/despedidas.rs. Em main.rs, use mod saudacoes; e mod despedidas;.

Mostrar solução
// src/saudacoes.rs
pub fn ola(nome: &str) -> String {
    format!("Olá, {}!", nome)
}
// src/despedidas.rs
pub fn tchau(nome: &str) -> String {
    format!("Tchau, {}!", nome)
}
// src/main.rs
mod saudacoes; // procura por src/saudacoes.rs
mod despedidas; // procura por src/despedidas.rs

fn main() {
    let nome = "Rust";
    println!("{}", saudacoes::ola(nome));
    println!("{}", despedidas::tchau(nome));
}

Passo a passo

  1. Criamos o arquivo src/saudacoes.rs com a função ola. O pub permite que ela seja usada fora do módulo.
  2. Criamos src/despedidas.rs com a função tchau, também pública.
  3. No main.rs, mod saudacoes; instrui o compilador a carregar o arquivo src/saudacoes.rs como um módulo chamado saudacoes.
  4. mod despedidas; faz o mesmo para o outro arquivo.
  5. No main, chamamos saudacoes::ola(nome) e despedidas::tchau(nome), passando a string "Rust".
  6. println! imprime cada mensagem em uma linha separada.

Por que funciona

A convenção de módulos em Rust mapeia o nome do módulo para um arquivo .rs ou um diretório com mod.rs. Ao declarar mod saudacoes; na raiz (main.rs), o compilador busca src/saudacoes.rs. As funções são públicas, então podem ser acessadas via saudacoes::ola. O format! cria uma String formatada.

Erros comuns

  • Esquecer pub na função: fn ola(...) dentro do arquivo. O erro é function ola is private.
  • Nomear o arquivo errado: se criar src/saudacao.rs mas declarar mod saudacoes;, o compilador não encontra o arquivo.
  • Tentar usar saudacoes::ola sem declarar mod saudacoes; no main.rs: use of undeclared crate or module saudacoes``.

Outra forma de resolver

Usar use para importar as funções:

mod saudacoes;
mod despedidas;

use saudacoes::ola;
use despedidas::tchau;

fn main() {
    let nome = "Rust";
    println!("{}", ola(nome));
    println!("{}", tchau(nome));
}

Preferível quando as funções são usadas várias vezes.

Saída esperada

Olá, Rust!
Tchau, Rust!