Iterator::step_by în Rust

Produce primul element și apoi fiecare al n-lea: sare peste elemente cu un pas fix.

Sintaxă
fn step_by(self, step: usize) -> StepBy<Self>

Ce face Iterator::step_by

step_by(n) dă elementul de pe poziția 0, apoi pe cele de pe pozițiile n, 2n, 3n etc. Pe un interval, (0..=20).step_by(5) dă 0, 5, 10, 15, 20. Pe un vector, ia fiecare al n-lea element.

Pasul trebuie să fie cel puțin 1; step_by(0) oprește programul cu panic. Pentru pași înapoi, pune rev() înainte: (0..=10).rev().step_by(2). 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
step Pasul (cel puțin 1).

Ce returnează

Un iterator StepBy.

Exemple

Exemplul 1: Intervale cu pas

fn main() {
    let din_5_in_5: Vec<u32> = (0..=20).step_by(5).collect();
    println!("{:?}", din_5_in_5);

    let impare: Vec<u32> = (1..10).step_by(2).collect();
    println!("{:?}", impare);

    let inapoi: Vec<u32> = (0..=10).rev().step_by(3).collect();
    println!("{:?}", inapoi);
}

Rezultat

[0, 5, 10, 15, 20]
[1, 3, 5, 7, 9]
[10, 7, 4, 1]

Exemplul 2: Fiecare a doua zi și orele unei ture

fn main() {
    let zile = ["luni", "marți", "miercuri", "joi", "vineri", "sâmbătă", "duminică"];
    let alternativ: Vec<&str> = zile.iter().step_by(2).copied().collect();
    println!("la sală: {:?}", alternativ);

    for minut in (0..60).step_by(15) {
        print!("08:{minut:02} ");
    }
    println!();
}

Rezultat

la sală: ["luni", "miercuri", "vineri", "duminică"]
08:00 08:15 08:30 08:45

Greșeli frecvente

  • Apelezi step_by(0) (de exemplu cu un pas calculat): assertion failed: step != 0.
  • Te aștepți ca step_by să sară primul element: primul este mereu inclus. Pune skip(1) înainte dacă vrei să începi de la al doilea.

Comenzi înrudite

  • Range: Intervalul a..b: toate valorile de la a inclusiv până la b exclusiv. Este iterator, se folosește în for și la tăierea slice-urilor.
  • Iterator::take: take(n) produce cel mult primele n elemente; skip(n) sare peste primele n și produce restul.
  • Iterator::rev: Inversează direcția unui iterator: produce elementele de la ultimul la primul, fără să copieze nimic.
  • Vec::windows: windows dă ferestre suprapuse de câte n elemente consecutive; chunks împarte vectorul în bucăți separate de câte n.