Consumindo Iteradores
O consumo executa o pipeline: for, collect, sum, count, fold, reduce, last, any, all.
Receita
fn main() {
let total: i32 = (1..=5).sum();
let evens: Vec<_> = (0..10).filter(|n| n % 2 == 0).collect();
println!("{total} {:?}", evens);
}Quando usar isso: Etapa final após os adaptadores - escolha o consumidor que corresponde à necessidade de saída.
Exemplo de Trabalho
fn stats(nums: impl IntoIterator<Item = f64>) -> (f64, f64) {
let mut count = 0u64;
let sum: f64 = nums.into_iter().inspect(|_| count += 1).sum();
(sum, sum / count as f64)
}
fn main() {
println!("{:?}", stats([1.0, 2.0, 3.0]));
}O que isso demonstra:
- Consumidor
sum - Contagem de efeito colateral
inspect - Entrada flexível
IntoIterator
Mergulho Profundo
collect constrói muitos tipos via FromIterator. fold é um redutor geral. for é desaçucarado para while let Some.
Armadilhas
collectsem dica de tipo - Ambíguo. Correção:collect::<Vec<_>>().sumem vazio - Retorna zero para tipos numéricos - conheça a identidade.reduceem vazio - RetornaNone. Correção:foldcom semente.formuta enquanto itera sobre o adaptador - Regras de empréstimo na origem.collectdesnecessário -clippysinaliza alocações extras.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
try_for_each | Cada etapa é falível | Precisa de vec coletado |
| Loop manual | break/continue complexos | sum simples |
fold | Acumulador único | sum embutido funciona |
FAQs
Coletar para String?
Use `join` após coletar caracteres ou escreva!.partition?
Divide em dois `vec`s por predicado.unzip?
Par de `vec`s a partir de itens (A,B).count?
Consome o iterador completo.last?
Precisa de varredura completa.max?
Requer `Ord` no Item.for borrow?
Use `for x in &collection`.extend?
Use `vec.extend(iter)`.from_iter?
Alias para `collect`.benchmark?
Compare `collect` vs manual.Relacionados
- Adaptadores de Iterador
- IntoIterator & Possuído vs Emprestado
- Iteradores Falíveis & collect()
- Fluxo de Controle
Versões do Stack: 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+.