iter::repeat în Rust

Creează un iterator care repetă la nesfârșit aceeași valoare; de obicei urmat de take(n).

Sintaxă
pub fn repeat<T: Clone>(elt: T) -> Repeat<T>
pub fn repeat_n<T: Clone>(element: T, count: usize) -> RepeatN<T>   // Rust 1.82

Ce face iter::repeat

std::iter::repeat(x) produce x (clonat) de fiecare dată când i se cere un element, fără sfârșit. Se folosește cu take(n) pentru n copii sau cu zip, unde celălalt șir decide lungimea. repeat_n(x, n) dă direct n copii.

Pentru text există mai simplu "-".repeat(20), iar pentru vectori vec![x; n]. repeat este util când ai nevoie de valori repetate într-un lanț de iteratori.

Parametri

Parametru Descriere
elt Valoarea repetată (trebuie să implementeze Clone).

Ce returnează

Un iterator infinit Repeat (sau finit, RepeatN).

Exemple

Exemplul 1: Copii ale unei valori

use std::iter::{repeat, repeat_n};

fn main() {
    let linie: String = repeat('=').take(20).collect();
    println!("{linie}");

    let initiale: Vec<u32> = repeat_n(5, 3).collect();
    println!("{:?}", initiale);

    let felicitari: Vec<String> = ["Ana", "Mihai"].iter().zip(repeat("La mulți ani")).map(|(n, m)| format!("{m}, {n}!")).collect();
    println!("{:?}", felicitari);
}

Rezultat

====================
[5, 5, 5]
["La mulți ani, Ana!", "La mulți ani, Mihai!"]

Exemplul 2: Completarea unui tabel până la o lungime fixă

use std::iter::repeat;

fn main() {
    let note = vec![9, 7];
    let complet: Vec<String> = note
        .iter()
        .map(|n| n.to_string())
        .chain(repeat(String::from("-")))
        .take(5)
        .collect();
    println!("{}", complet.join(" | "));
}

Rezultat

9 | 7 | - | - | -

Greșeli frecvente

  • Colectezi repeat(x) fără take: programul nu se mai oprește.
  • Folosești repeat pentru un vector simplu: vec![x; n] e mai clar.

Comenzi înrudite

  • Iterator::take: take(n) produce cel mult primele n elemente; skip(n) sare peste primele n și produce restul.
  • Iterator::cycle: Repetă la nesfârșit elementele iteratorului: după ultimul, o ia de la capăt.
  • iter::once: once(x) creează un iterator cu un singur element; empty() creează un iterator fără niciun element.
  • Vec::resize: Schimbă lungimea vectorului: îl taie dacă e prea lung sau adaugă copii ale unei valori până la noua lungime.