Adaptadores de Iterador
Adaptadores transformam iteradores de forma preguiçosa (lazy): map, filter, take, skip, zip, flat_map, enumerate, peekable.
Receita
fn main() {
let out: Vec<i32> = (0..10)
.filter(|n| n % 2 == 0) // Filtra números pares
.map(|n| n * 2) // Dobra os números pares
.collect(); // Coleta os resultados em um Vec<i32>
println!("{:?}", out); // Imprime o vetor resultante
}Quando usar isso: Transformações em estilo funcional sem Vec intermediário, a menos que seja necessário.
Exemplo de Trabalho
// Função para analisar linhas de texto e convertê-las em inteiros
fn parse_lines(lines: &str) -> Result<Vec<i32>, std::num::ParseIntError> {
lines.lines() // Cria um iterador sobre as linhas do texto
.map(|l| l.trim().parse()) // Para cada linha, remove espaços em branco e tenta analisar como i32
.collect() // Coleta os resultados em um Result<Vec<i32>, ParseIntError>
}
fn main() {
let data = "1\n2\n3\n"; // Dados de exemplo
println!("{:?}", parse_lines(data)); // Chama a função e imprime o resultado
}O que isso demonstra:
- Adaptador
lines()em&str map+collectparaResult<Vec<_>, _>- Preguiçoso (lazy) até
collect
Mergulho Profundo
A ordem da cadeia (chain) importa: filter antes de map evita trabalho inútil. flat_map achata Iterator<Item=impl Iterator>.
Armadilhas
- Múltiplas passagens em iterador "frio" - Consumido após a primeira passagem. Correção:
collecte depois reutilize ovec. - Closures capturando referências - Limites de tempo de vida (lifetime). Correção: Closure
moveou dados de propriedade (owned data). zipinfinito mais curto -ziptermina no mais curto. Correção: Cratezip_longestse necessário.filter_mapvsmap+filter- Passagem única comfilter_map.- Inferência de tipo
collect-Turbofish(::<Type>) necessário às vezes.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Loop for | Fluxo de controle complexo | Transformações simples |
rayon par_iter | Paralelismo de CPU | Ligado a I/O (I/O bound) |
| Índice manual | Acesso a vizinhos | Existem adaptadores limpos |
FAQs
preguiçoso (lazy)?
Até o adaptador ser consumido.encadear (chain)?
Concatena iteradores.ciclar (cycle)?
Repetição infinita.escanear (scan)?
Map com estado.janelas (windows)?
Em slices, não em todos os iteradores.inspecionar (inspect)?
Efeito colateral por item.duplicar (tee)?
Divide o iterador - precisa do `itertools`.assíncrono (async)?
Adaptadores `StreamExt`.desempenho?
LLVM frequentemente funde loops.clippy?
Avisa sobre `needless_collect`.Relacionados
- A Trait Iterator
- Consumindo Iteradores
- Padrões de Iterador + Closure
- Iteradores Falíveis & collect()
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+.