String::len în Rust

String Rust 1.0

Lungimea textului în OCTEȚI (nu în litere) și verificarea dacă textul e gol. Pentru litere: chars().count().

Sintaxă
pub fn len(&self) -> usize
pub fn is_empty(&self) -> bool

Ce face String::len

len() returnează numărul de octeți din reprezentarea UTF-8 a textului. Pentru text în engleză octeții și literele coincid, dar în română nu: ă, â, î, ș, ț ocupă câte 2 octeți, € ocupă 3, iar un emoji 4. Rezultatul este calculat instant (lungimea este memorată).

Pentru numărul de caractere folosește s.chars().count(); aceasta parcurge tot textul. Nici aceasta nu numără întotdeauna „ce vede omul”: o literă scrisă cu un semn diacritic combinat (a + \u{306}) înseamnă 2 caractere char.

is_empty() este echivalentul lui len() == 0, dar se citește mai clar. Aceleași metode există pe &str (str::len, str::is_empty), deci funcționează și pe literali și pe bucăți de text.

Ce returnează

len: numărul de octeți (usize). is_empty: true dacă textul nu are niciun octet.

Exemple

Exemplul 1: Octeți și caractere pentru texte românești

fn main() {
    for text in ["Cluj", "Iași", "ștergătoare", "100 €", ""] {
        println!(
            "{:<14} len = {:>2}, chars = {:>2}, is_empty = {}",
            format!("{text:?}"),
            text.len(),
            text.chars().count(),
            text.is_empty()
        );
    }
}

Rezultat

"Cluj"         len =  4, chars =  4, is_empty = false
"Iași"         len =  5, chars =  4, is_empty = false
"ștergătoare"  len = 13, chars = 11, is_empty = false
"100 €"        len =  7, chars =  5, is_empty = false
""             len =  0, chars =  0, is_empty = true

Exemplul 2: Validarea lungimii unui nume de utilizator

Limita de 8 trebuie să fie în litere, nu în octeți; altfel un nume cu diacritice este respins pe nedrept.

fn valid(nume: &str) -> bool {
    let litere = nume.chars().count();
    !nume.is_empty() && litere <= 8
}

fn main() {
    for nume in ["ana", "ștefănel", "ionuț_popescu", ""] {
        println!("{nume:?}: {} octeți, valid = {}", nume.len(), valid(nume));
    }
}

Rezultat

"ana": 3 octeți, valid = true
"ștefănel": 10 octeți, valid = true
"ionuț_popescu": 14 octeți, valid = false
"": 0 octeți, valid = false

Greșeli frecvente

  • Folosești len() ca număr de litere, de exemplu pentru alinierea textului sau limite de caractere. Pe texte cu diacritice rezultatul este mai mare.
  • Scrii s.len() == 0. Merge, dar s.is_empty() este forma obișnuită (și Clippy o recomandă).

Comenzi înrudite

  • str::chars: Parcurge textul caracter cu caracter (char Unicode), nu octet cu octet. Cu count() afli numărul de litere.
  • String::with_capacity: Creează un String gol cu loc rezervat pentru cel puțin n octeți; capacity() arată cât loc există.
  • char::len_utf8: Câți octeți ocupă caracterul când este scris în UTF-8, adică într-un String: între 1 și 4.
  • str::bytes: Accesul la octeții UTF-8 ai textului: bytes() ca iterator de u8, as_bytes() ca felie &[u8].