str::char_indices în Rust

Parcurge caracterele împreună cu poziția lor în octeți: perechi (usize, char).

Sintaxă
pub fn char_indices(&self) -> CharIndices<'_>

Ce face str::char_indices

char_indices() este ca chars(), dar fiecare element este o pereche (poziție, caracter), unde poziția este octetul la care începe caracterul. Pozițiile astea sunt mereu granițe valide, deci le poți folosi sigur pentru tăiere (&s[..poz]), insert, truncate sau split_off.

Observă salturile: după un caracter de 2 octeți, poziția următoare crește cu 2. Nu confunda cu chars().enumerate(), care numără caracterele (0, 1, 2…) și nu dă poziții bune pentru tăiere.

Ce returnează

Un iterator de perechi (usize, char).

Exemple

Exemplul 1: Pozițiile în octeți sar peste diacritice

fn main() {
    for (poz, c) in "Țară".char_indices() {
        println!("octetul {poz}: {c}");
    }
    let enumerate: Vec<(usize, char)> = "Țară".chars().enumerate().collect();
    println!("cu enumerate: {enumerate:?}");
}

Rezultat

octetul 0: Ț
octetul 2: a
octetul 3: r
octetul 4: ă
cu enumerate: [(0, 'Ț'), (1, 'a'), (2, 'r'), (3, 'ă')]

Exemplul 2: Primele n litere, ca &str, fără copiere

fn primele(text: &str, n: usize) -> &str {
    match text.char_indices().nth(n) {
        Some((poz, _)) => &text[..poz],
        None => text,
    }
}

fn main() {
    println!("{}", primele("Ștefănești", 4));
    println!("{}", primele("Ion", 10));
}

Rezultat

Ștef
Ion

Greșeli frecvente

  • Folosești indicele din chars().enumerate() pentru tăiere și primești panică pe texte cu diacritice.

Comenzi înrudite

  • str::chars: Parcurge textul caracter cu caracter (char Unicode), nu octet cu octet. Cu count() afli numărul de litere.
  • str::get: Taie textul sigur: get(a..b) returnează None în loc de panică; is_char_boundary verifică o poziție.
  • String::truncate: Scurtează textul la primii new_len octeți; nu face nimic dacă textul e deja mai scurt.
  • str::find: Caută prima (find) sau ultima (rfind) apariție și returnează poziția ei în octeți, sau None.