Iterator::take în Rust

take(n) produce cel mult primele n elemente; skip(n) sare peste primele n și produce restul.

Sintaxă
fn take(self, n: usize) -> Take<Self>
fn skip(self, n: usize) -> Skip<Self>

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 skip cu skip_while: skip sare un număr fix, skip_while sare 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).