No description
Find a file
2026-09-01 13:33:25 +02:00
.woodpecker chore: migrate CI to .woodpecker/{push,branch}.yml 2026-09-01 13:33:25 +02:00
src fix(025): pedagogical MINOR fixes 2026-09-01 13:33:25 +02:00
tests fix: content audit corrections (accuracy, coherence, concordância, tests) 2026-09-01 13:33:25 +02:00
.gitignore Initial commit 2026-09-01 11:32:47 +00:00
Cargo.lock initial content 2026-09-01 13:33:23 +02:00
Cargo.toml chore: declare MSRV 1.85 (edition 2024) 2026-09-01 13:33:25 +02:00
LICENSE chore: add AGPL-3.0 license and standard .gitignore 2026-09-01 13:33:25 +02:00
README.md fix(025): pedagogical MINOR fixes 2026-09-01 13:33:25 +02:00

Lição 25: Métodos de Sistema (Métodos/Impl)

1. Narrativa

Cada componente do mecha Æther possui suas próprias operações — o reator gera energia, os escudos protegem contra ataques, os motores impulsionam no campo de batalha. Em Rust, impl blocks permitem associar métodos e funções associadas a structs, dando a cada componente seu comportamento próprio e encapsulado.

2. Conceito

Métodos em Rust são definidos dentro de impl blocks:

  • &self: Leitura de dados do componente (empréstimo imutável)
  • &mut self: Modificação do estado (empréstimo mutável)
  • Self: Alias para o tipo da struct — útil em construtores
  • Funções associadas: Sem self — construtores (new) e utilitários estáticos
  • Múltiplos impl blocks: Um por struct, cada qual com seus métodos

3. Requisitos

  • Implementar métodos com &self para consulta de dados
  • Implementar métodos com &mut self para modificação de estado
  • Criar construtores com new e funções associadas sem self
  • Usar Self como tipo de retorno em métodos

4. Design de Dados

graph TD
    A[Struct Reator] --> B[impl Reator]
    B --> C[new: construtor]
    B --> D[energia: &self → u32]
    B --> E[consumir: &mut self → bool]
    B --> F[versao_firmware: sem self]
    G[Struct Escudo] --> H[impl Escudo]
    I[Struct Motor] --> J[impl Motor]

5. Diagrama de Fluxo

flowchart TD
    A[Início] --> B[Criar componente via new]
    B --> C{Operação?}
    C -->|Consultar| D[Método &self]
    C -->|Modificar| E[Método &mut self]
    C -->|Estático| F[Função associada]
    D --> G[Retornar valor]
    E --> H[Alterar estado]
    F --> I[Retornar constante]
    G --> J[Fim]
    H --> J
    I --> J

6. Funções

Função Descrição
Reator::new Construtor com capacidade
Reator::sem_energia Construtor alternativo sem energia
Reator::energia Consulta energia atual (&self)
Reator::capacidade Consulta capacidade (&self)
Reator::porcentagem_energia Calcula porcentagem (&self)
Reator::esta_operacional Verifica se energia > 0 (&self)
Reator::consumir Consome energia (&mut self)
Reator::recarregar Recarrega energia (&mut self)
Reator::recarregar_total Recarrega ao máximo (&mut self)
Reator::clonar Clona usando Self
Reator::versao_firmware Função associada sem self
Escudo::novo Construtor do escudo
Escudo::absorver_dano Absorve dano e retorna excedente
Motor::novo Construtor na origem
Motor::acelerar Aumenta velocidade
Motor::mover Move adicionando deslocamento
Diagnostico::novo Construtor do diagnóstico
Diagnostico::relatorio Gera relatório de status

7. Exemplo

let mut reator = Reator::new(1000);
assert!(reator.esta_operacional());
assert_eq!(reator.porcentagem_energia(), 100.0);
reator.consumir(300);
assert_eq!(reator.energia(), 700);
assert_eq!(Reator::versao_firmware(), "REACT-4.2.1");
assert_eq!(Diagnostico::versao_sistema(), "DIAG-3.8.0");

8. Missão

  1. Implementar Reator::new e Reator::sem_energia
  2. Implementar métodos de consulta: energia, capacidade, porcentagem_energia, esta_operacional
  3. Implementar métodos de modificação: consumir, recarregar, recarregar_total
  4. Implementar Reator::clonar e Reator::versao_firmware (retorna "REACT-4.2.1")
  5. Implementar todos os métodos de Escudo
  6. Implementar todos os métodos de Motor
  7. Implementar todos os métodos de Diagnosticoversao_sistema() deve retornar "DIAG-3.8.0"

9. Como Executar

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

10. Dicas

  • &self é açúcar para self: &Self — empréstimo imutável do receptor
  • &mut self permite modificar campos — apenas um empréstimo mutável por vez
  • Funções associadas (sem self) são chamadas via Struct::funcao(), não instancia.funcao()
  • Self no retorno facilita refatoração — se renomear a struct, não precisa atualizar