Поиск длины строки

Rust:
Поиск длины строки

Как это сделать:

Rust предлагает использовать len() для прямой оценки длины:

fn main() {
    let greeting = "Привет, мир!";
    println!("Длина: {}", greeting.len());
}

Вывод: Длина: 13

Однако, будьте осторожны, len() считает байты, а не символы. Для подсчета символов используйте .chars().count():

fn main() {
    let greeting = "¡Hola, mundo!";
    println!("Количество символов: {}", greeting.chars().count());
}

Вывод: Количество символов: 12

Подробнее

len() считает байты, потому что строки в Rust кодируются в UTF-8. Исторически, первые компьютеры использовали ASCII, представляя каждый символ одним байтом. Однако UTF-8 поддерживает огромное количество символов, используя от 1 до 4 байт на каждый.

Когда вы вызываете len(), Rust считает байты в строке, что быстро, но не всегда соответствует количеству символов. Например, эмодзи или определенные символы с акцентами занимают более одного байта. Вот почему важно использование .chars().count() — оно итерирует по символам и возвращает количество скалярных значений Unicode, что и является количеством символов, которое большинство людей ожидает.

Что касается альтернатив, .chars().count() точно, но медленно для длинных строк, поскольку ему необходимо итерировать каждый символ. Если производительность критична, и вы уверены, что работаете с ASCII или с символами Unicode фиксированной ширины, len() более эффективен.

Наконец, помните, что индексация строк в Rust не позволяет прямого доступа по позиции символа из-за того, как работает кодировка UTF-8. Rust предотвращает операции, которые могли бы случайно нарушить или разделить строки в неправильных местах, которые могли бы не представлять полные символы.

См. также