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, dars.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].