Padrões de Iterador + Closure
Closures potencializam adaptadores de iterador para pipelines de dados preguiçosos e expressivos.
Receita
fn active_names(users: &[(&str, bool)]) -> Vec<String> {
users.iter()
.filter(|(_, active)| *active) // Filtra usuários ativos
.map(|(name, _)| name.to_uppercase()) // Mapeia para nomes em maiúsculas
.collect() // Coleta os nomes em um Vec<String>
}Quando usar isso: Transformar coleções sem mutação intermediária.
Exemplo de Trabalho
#[derive(Debug)]
struct Order { total: u32, vip: bool }
fn discount_summary(orders: &[Order]) -> (u32, u32) {
let vip_total: u32 = orders.iter()
.filter(|o| o.vip) // Filtra pedidos VIP
.map(|o| o.total) // Mapeia para o total do pedido
.sum(); // Soma os totais dos pedidos VIP
let regular: u32 = orders.iter()
.filter(|o| !o.vip) // Filtra pedidos regulares
.map(|o| o.total / 2) // Mapeia para metade do total do pedido
.sum(); // Soma os totais dos pedidos regulares
(vip_total, regular)
}O que isso demonstra:
- Múltiplas passagens são aceitáveis para clareza (ou combine com
fold) - Closures em
filter/map collectcomo consumidor para somar
Mergulho Profundo
Prefira filter_map em vez de filter+map. Use fold para agregação em passagem única. then (1.51+) encadeia etapas de Option.
Armadilhas
- Clonagem em
map-|s| s.clone(). Correção: Use referências mais cedo. - Closure mutável em
rayonparalelo -FnnãoFnMut- apenas sincronizado. - Longas cadeias de closures - Extraia funções nomeadas.
collectdesnecessário - Aviso do clippy.moveclosure em loop - Pode forçar a movimentação de todo o ambiente a cada iteração.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
Loop for | break/continue complexos | Pipeline direto |
| SQL/motor de consulta | Grandes volumes de dados | Vec pequeno em memória |
rayon | Paralelismo de CPU | Vinculado a I/O |
FAQs
filter_map?
Mapeia e descarta `Nones` em um só.flat_map?
Achata iteradores aninhados.scan?
Mapeamento com estado e acumulador.inspect?
Ponto de depuração na pipeline.chain Option?
Use `and_then` em `Option`, não em iterador.janelas/pedaços?
Em slices via adaptadores `windows`/`chunks` em arrays.sort_by closure?
Compare com `FnMut`.group_by instável?
Use o crate `itertools` para `group_by` estável.polars?
Expressões preguiçosas com espírito semelhante.legibilidade?
Divida em etapas nomeadas se houver mais de 5 adaptadores.Relacionados
- Adaptadores de Iterador
- Funções de Ordem Superior
- Consumindo Iteradores
- Paralelismo de Dados com Rayon
Versões da Pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.