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 предотвращает операции, которые могли бы случайно нарушить или разделить строки в неправильных местах, которые могли бы не представлять полные символы.
См. также
- Официальная документация по строкам Rust: https://doc.rust-lang.org/std/string/
- Книга Rust о строках: https://doc.rust-lang.org/book/ch08-02-strings.html
- Чтобы узнать больше о различиях между UTF-8 и ASCII, посетите https://tools.ietf.org/html/rfc3629