No description
Find a file
2026-09-01 13:30:03 +02:00
.woodpecker chore: migrate CI to .woodpecker/{push,branch}.yml 2026-09-01 13:30:03 +02:00
src fix(021): pedagogical MINOR fixes 2026-09-01 13:30:03 +02:00
tests initial content 2026-09-01 13:30:00 +02:00
.gitignore Initial commit 2026-09-01 11:29:39 +00:00
Cargo.lock initial content 2026-09-01 13:30:00 +02:00
Cargo.toml chore: declare MSRV 1.85 (edition 2024) 2026-09-01 13:30:03 +02:00
LICENSE chore: add AGPL-3.0 license and standard .gitignore 2026-09-01 13:30:03 +02:00
README.md fix(021): pedagogical MINOR fixes 2026-09-01 13:30:03 +02:00

Lição 21: Interface do Sistema (Dot Operator)

1. Narrativa

O mecha Æther é um sistema complexo com centenas de operações. Interface do Sistema ensina o piloto a organizar o código em funções claras — cada função é como um comando da cabine, com entrada, processamento e saída bem definidos. O operador . é a "interface" que conecta o piloto aos dados e operações do sistema.

Nota: Esta lição expande o conceito de funções da Lição 9, focando no operador . como veículo para acessar e transformar dados (métodos de slice, format!, etc.).

2. Conceito

Funções são os blocos fundamentais de organização em Rust, e o operador . é a interface que acessa seus dados:

  • Parâmetros: Entradas com tipos explícitos
  • Retorno: Tipo de saída declarado com ->
  • Expressões: Última linha sem ; é o retorno
  • Operador .: Acessa métodos e campos — slice.iter(), format!(), valor.abs()
  • Funções como interface: Cada função encapsula uma operação do sistema, chamada pelo piloto

3. Requisitos

  • Criar funções com diferentes assinaturas
  • Usar parâmetros por valor e por referência
  • Retornar tipos compostos

4. Design de Dados

graph LR
    A[Entrada: params] --> B[Corpo da função]
    B --> C{Processamento}
    C --> D[Retorno: tipo]
    D --> E[Chamador recebe]
    A --> F[&str: referência]
    A --> G[i32: valor]
    D --> H[String: owned]
    D --> I[bool: simples]

5. Diagrama de Fluxo

flowchart TD
    A[Definir função] --> B[Parâmetros com tipos]
    B --> C[Corpo: processamento]
    C --> D{Tipo de retorno}
    D -->|Cálculo| E[Retorna i32/f64]
    D -->|Texto| F[Retorna String]
    D -->|Verificação| G[Retorna bool]
    E --> H[Funções auxiliares]
    F --> H
    G --> H

6. Funções

Função Descrição
calcular_velocidade Calcula velocidade média (distância / tempo)
formatar_status Formata nome e valor em string de status
verificar_faixa Verifica se valor está dentro de faixa
somar_componentes Soma valores de um slice
maior_valor Encontra o maior valor em um slice
criar_relatorio Cria relatório formatado com múltiplos dados
converter_unidade Converte valor entre unidades
calcular_eficiencia Calcula porcentagem de eficiência

7. Exemplo

fn calcular_velocidade(distancia: f64, tempo: f64) -> f64 {
    if tempo == 0.0 {
        0.0
    } else {
        distancia / tempo
    }
}

let vel = calcular_velocidade(100.0, 2.0);
assert_eq!(vel, 50.0);

8. Missão

  1. Implementar calcular_velocidade com divisão segura
  2. Implementar formatar_status usando format!()
  3. Implementar verificar_faixa com limites inclusivos
  4. Implementar somar_componentes iterando sobre slice
  5. Implementar maior_valor encontrando máximo
  6. Implementar criar_relatorio combinando dados em String
  7. Implementar converter_unidade com fator de conversão
  8. Implementar calcular_eficiencia como porcentagem

9. Como Executar

cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check

10. Dicas

  • Parâmetros por valor movem ownership, por referência (&) emprestam
  • A última expressão sem ; é o retorno da função
  • format!() cria Strings formatadas como println!() mas retorna o valor
  • Funções pequenas e focadas são mais fáceis de testar e reutilizar