Iterator::rev în Rust

Inversează direcția unui iterator: produce elementele de la ultimul la primul, fără să copieze nimic.

Sintaxă
fn rev(self) -> Rev<Self>
where Self: DoubleEndedIterator

Ce face Iterator::rev

rev() citește iteratorul de la coadă, folosind next_back(). Nu creează o copie inversată și nu modifică sursa. Funcționează doar pe iteratori care știu unde se termină (DoubleEndedIterator): vectori, tablouri, intervale, chars(), BTreeMap.

Pentru o numărătoare inversă, scrie (1..=10).rev(), nu 10..=1 (un interval cu începutul mai mare decât sfârșitul este gol). Ca toate adaptoarele, este leneș: nu face nimic până când iteratorul nu este consumat (de for, collect, sum, count etc.).

Ce returnează

Un iterator Rev cu elementele în ordine inversă.

Exemple

Exemplul 1: Numărătoare inversă și listă de la coadă

fn main() {
    for n in (1..=5).rev() {
        print!("{n} ");
    }
    println!("start!");
    println!("10..=1 are {} elemente", (10..=1).count());

    let istoric = ["deschis", "editat", "salvat"];
    let recente: Vec<&str> = istoric.iter().rev().copied().collect();
    println!("{:?}", recente);
}

Rezultat

5 4 3 2 1 start!
10..=1 are 0 elemente
["salvat", "editat", "deschis"]

Exemplul 2: Text inversat și palindrom

fn main() {
    let oras = "Brașov";
    let inversat: String = oras.chars().rev().collect();
    println!("{oras} -> {inversat}");

    let cuvant = "capac";
    let palindrom = cuvant.chars().eq(cuvant.chars().rev());
    println!("{cuvant} este palindrom: {palindrom}");
}

Rezultat

Brașov -> voșarB
capac este palindrom: true

Greșeli frecvente

  • Scrii for i in 10..0 pentru numărătoare inversă: bucla nu rulează deloc. Scrie (0..10).rev() (atenție, dă 9..0) sau (1..=10).rev().
  • Inversezi octeții unui text (bytes().rev()): literele cu diacritice se strică. Folosește chars().rev().
  • Apelezi rev() pe un iterator fără capăt ((1..), from_fn): nu compilează.

Comenzi înrudite

  • DoubleEndedIterator: Iterator care poate produce valori și de la coadă (next_back); permite rev(), rfind() și parcurgerea din ambele capete.
  • Vec::reverse: Inversează pe loc ordinea elementelor: primul devine ultimul, ultimul devine primul.
  • Iterator::step_by: Produce primul element și apoi fiecare al n-lea: sare peste elemente cu un pas fix.
  • 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.