IntoIterator & Owned vs Borrowed
IntoIterator converte em um iterador. Três modos: iter() empresta compartilhado, iter_mut() empresta mutável, into_iter() consome a posse.
Receita
fn main() {
let v = vec![1, 2, 3];
// Itera sobre referências compartilhadas (&i32)
for x in &v { print!("{x} "); }
// Itera sobre valores possuídos (i32), consumindo v
for x in v.into_iter() { print!("{x} "); }
}Quando usar isso: Escolher se o for move, empresta ou modifica os elementos.
Exemplo de Trabalho
// Calcula a soma de um vetor emprestado (&Vec<i32>)
fn total_borrowed(v: &Vec<i32>) -> i32 {
// .iter() produz um iterador sobre referências compartilhadas (&i32)
v.iter().sum()
}
// Calcula a soma de um vetor possuído (Vec<i32>)
fn total_owned(v: Vec<i32>) -> i32 {
// .into_iter() produz um iterador sobre valores possuídos (i32), consumindo v
v.into_iter().sum()
}
fn main() {
let data = vec![1, 2, 3];
// data ainda é utilizável após total_borrowed
println!("{} {}", total_borrowed(&data), data.len());
// data é consumido por total_owned
println!("{}", total_owned(data));
// println!("{}", data.len()); // Erro: borrow of moved value: `data`
}O que isso demonstra:
itermantémdatautilizável após a soma.into_iterconsomedata.- A assinatura da API documenta a posse.
Mergulho Profundo
for x in collection chama into_iter na collection. &collection usa IntoIterator for &Vec produzindo &T.
Arrays [T; N] implementam IntoIterator copiando elementos se T for Copy.
Armadilhas
for x in vecmovevec- Não pode ser usado depois. Correção:for x in &vec.into_iterem&mut- Produz&mut T.collectapósinto_iter- A fonte é consumida.Iterator ItemvsIntoIterator- Tipos associados diferentes por implementação (impl).fngenérica +for- Useimpl IntoIteratorou genéricoI: IntoIterator.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Loop de índice | Precisa do índice + vizinhos | Idiomático para for each |
drain | Remover subconjunto | Consumo total |
Iteração as_slice | Slice explícito | iter() é similar |
FAQs
Tabela das três formas?
iter/&T, iter_mut/&mut T, into_iter/T possuído.for move?
`for x in v` move se `v` não for uma referência.Restrição IntoIterator?
fn f<I: IntoIterator<Item=T>>(i: I).array into_iter?
Move os elementos se não forem `Copy`.str into_iter?
chars(), bytes(), lines().Option into_iter?
0 ou 1 item.Result into_iter?
1 item Ok ou Err como padrões de elemento único são raros.extend de iter?
vec.extend(iter).cloned()?
Iterador sobre clones de &T.copied()?
Para tipos `Copy` a partir de &T.Relacionados
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+.