Ce face Iterator::take
take(n) se oprește după n elemente (sau mai devreme, dacă sursa se termină). Este modul de a lua „primele 10” sau de a limita un iterator infinit, de exemplu (1..).take(5). După ce a dat cele n elemente, nu mai cere nimic de la sursă.
skip(n) consumă și aruncă primele n elemente, apoi le dă pe toate celelalte. Combinate, ele fac paginare: skip((pagina - 1) * pe_pagina).take(pe_pagina). Ca toate adaptoarele, este leneș: nu face nimic până când iteratorul nu este consumat (de for, collect, sum, count etc.).
Parametri
| Parametru | Descriere |
|---|---|
n |
Numărul de elemente luate (take) sau sărite (skip). |
Ce returnează
Un iterator Take sau Skip.
Exemple
Exemplul 1: Primele, ultimele, paginare
fn main() {
let produse: Vec<String> = (1..=11).map(|i| format!("produs {i}")).collect();
let pe_pagina = 4;
for pagina in 1..=3 {
let afisate: Vec<&String> = produse.iter().skip((pagina - 1) * pe_pagina).take(pe_pagina).collect();
println!("pagina {pagina}: {:?}", afisate);
}
}
Rezultat
pagina 1: ["produs 1", "produs 2", "produs 3", "produs 4"]
pagina 2: ["produs 5", "produs 6", "produs 7", "produs 8"]
pagina 3: ["produs 9", "produs 10", "produs 11"]
Exemplul 2: take pe un iterator infinit
1.. nu are sfârșit; take îl face finit. Fără el, collect nu s-ar termina niciodată.
fn main() {
let patrate: Vec<u64> = (1..).map(|x| x * x).take(6).collect();
println!("{:?}", patrate);
let multipli_de_7: Vec<u32> = (1..).filter(|x| x % 7 == 0).take(5).collect();
println!("{:?}", multipli_de_7);
}
Rezultat
[1, 4, 9, 16, 25, 36]
[7, 14, 21, 28, 35]
Exemplul 3: Fără linia de antet a unui CSV
fn main() {
let csv = "nume,oras,varsta\nAna,Iași,25\nMihai,Cluj,31\nIoana,Brașov,28";
for linie in csv.lines().skip(1) {
let campuri: Vec<&str> = linie.split(',').collect();
println!("{} din {} are {} ani", campuri[0], campuri[1], campuri[2]);
}
}
Rezultat
Ana din Iași are 25 ani
Mihai din Cluj are 31 ani
Ioana din Brașov are 28 ani
Greșeli frecvente
- Colectezi un iterator infinit fără
take((1..).collect::<Vec<_>>()): programul rulează până rămâne fără memorie. - Te aștepți ca
take(10)să dea mereu 10 elemente: dacă sursa are mai puține, le dă doar pe acelea, fără eroare. - Confunzi
skipcuskip_while:skipsare un număr fix,skip_whilesare cât timp o condiție e adevărată.
Comenzi înrudite
Iterator::take_while: take_while dă elemente cât timp condiția e adevărată și se oprește la primul care nu o îndeplinește; skip_while sare până atunci.Iterator::step_by: Produce primul element și apoi fiecare al n-lea: sare peste elemente cu un pas fix.Iterator::nth: nth(n) returnează elementul de pe poziția n (de la 0) și îl consumă împreună cu cele dinainte; last returnează ultimul element.Iterator::by_ref: Împrumută iteratorul în loc să-l consume, ca să poți folosi un adaptor pe o parte din el și să continui apoi cu restul.iter::repeat: Creează un iterator care repetă la nesfârșit aceeași valoare; de obicei urmat de take(n).