No description
Find a file
2026-08-31 11:23:51 +02:00
.woodpecker chore: migrate CI to .woodpecker/{push,branch}.yml 2026-08-31 11:23:51 +02:00
src fix(034): correct comprimentos_nao_vazios expected value [1,2,1,2] 2026-08-31 11:23:51 +02:00
tests fix(034): correct comprimentos_nao_vazios expected value [1,2,1,2] 2026-08-31 11:23:51 +02:00
.gitignore Initial commit 2026-08-31 09:23:17 +00:00
Cargo.lock initial content 2026-08-31 11:23:47 +02:00
Cargo.toml chore: declare MSRV 1.85 (edition 2024) 2026-08-31 11:23:51 +02:00
LICENSE chore: add AGPL-3.0 license and standard .gitignore 2026-08-31 11:23:51 +02:00
README.md fix: content audit corrections (accuracy, coherence, concordância, tests) 2026-08-31 11:23:51 +02:00

Lição 34: Iterators (Varredura de Sistemas)

1. Narrativa

O mecha Æther possui dezenas de sensores que devem ser processados em sequência. Varredura de Sistemas é a técnica de percorrer coleções de dados elemento por elemento, aplicando transformações e filtros. O piloto experiente domina os iterators para processar streams de dados com eficiência e clareza.

2. Conceito

Iterators são objetos que representam sequências de dados. Em Rust, são lazy — só executam quando consumidos. Principais métodos:

  • Adaptadores: .map(), .filter(), .take(), .skip() — transformam iterators
  • Consumidores: .collect(), .fold(), .sum() — produzem resultados finais
  • Busca: .find(), .any(), .all() — verificam condições

3. Requisitos

  • Criar funções que usam iterators para processar dados
  • Encadear múltiplos adaptadores
  • Usar consumidores para agregar resultados

4. Design de Dados

graph LR
    A[Input: Vec<T>] --> B[.iter()]
    B --> C[.map f]
    C --> D[.filter pred]
    D --> E[.collect]
    E --> F[Output: Vec<U>]

5. Diagrama de Fluxo

flowchart TD
    A[Início] --> B[Para cada elemento]
    B --> C{ map-transformado}
    C -->|Sim| D{ filter-passou?}
    C -->|Não| F[Próximo]
    D -->|Sim| G[Adicionar ao resultado]
    D -->|Não| F
    G --> F
    F --> H{Mais elementos?}
    H -->|Sim| B
    H -->|Não| I[Fim]

6. Funções

Função Descrição
duplicar_valores Dobra cada elemento via .map()
filtrar_pares Mantém apenas números pares
somar_tudo Soma todos os elementos com .fold()
encontrar_maior Retorna primeiro maior que limiar
contar_maiores Conta elementos acima do limiar
comprimentos_nao_vazios Mapa de strings para seus tamanhos
todos_positivos Verifica se todos são positivos
primeiros_tres Retorna os 3 primeiros elementos

7. Exemplo

let numeros = vec![1, 2, 3, 4, 5];
let resultado: Vec<_> = numeros
    .iter()
    .map(|x| x * 2)
    .filter(|x| *x > 4)
    .collect();
assert_eq!(resultado, vec![6, 8, 10]);

8. Missão

  1. Implementar duplicar_valores usando .iter().map().collect()
  2. Implementar filtrar_pares usando .iter().filter().collect()
  3. Implementar somar_tudo usando .iter().fold()
  4. Implementar encontrar_maior usando .iter().find()
  5. Encadear .filter().count() em contar_maiores
  6. Usar .filter().map().collect() em comprimentos_nao_vazios
  7. Implementar todos_positivos com .all()
  8. Implementar primeiros_tres com .take().cloned().collect()

9. Como Executar

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

10. Dicas

  • Iterators são lazy — nada acontece até chamar um consumidor
  • .iter() produz referências, .into_iter() move (ownership)
  • .map() é um adaptador, não consome o iterator
  • Use .cloned() quando precisar copiar valores de referências