Модуль string
Описание
UTF-8 кодированная, расширяемая строка.
Этот модуль содержит тип String, трейт ToString для преобразования в строки и несколько типов ошибок, которые могут возникнуть при работе со String.
Примеры
Создание строк
Есть несколько способов создать новую String из строкового литерала:
#![allow(unused)] fn main() { let s = "Hello".to_string(); let s = String::from("world"); let s: String = "also this".into(); }
Конкатенация строк
Вы можете создать новую String из существующей с помощью конкатенации с +:
#![allow(unused)] fn main() { let s = "Hello".to_string(); let message = s + " world!"; }
Преобразование из/в байты
Если у вас есть вектор валидных UTF-8 байт, вы можете создать из него String. Вы можете сделать и обратное преобразование.
#![allow(unused)] fn main() { let sparkle_heart = vec![240, 159, 146, 150]; // Мы знаем, что эти байты валидны, поэтому используем `unwrap()`. let sparkle_heart = String::from_utf8(sparkle_heart).unwrap(); assert_eq!("💖", sparkle_heart); let bytes = sparkle_heart.into_bytes(); assert_eq!(bytes, [240, 159, 146, 150]); }
Структуры
Drain
Итератор дренажа для String. Позволяет извлекать части строки.
FromUtf8Error
Возможное значение ошибки при преобразовании String из вектора UTF-8 байт.
FromUtf16Error
Возможное значение ошибки при преобразовании String из среза UTF-16 байт.
String
UTF-8 кодированная, расширяемая строка.
IntoChars ⚡️
Экспериментальный итератор по символам строки.
Трейты
ToString
Трейт для преобразования значения в String.
Псевдонимы типов
ParseError
Псевдоним типа для Infallible. Используется при парсинге строк.
Основные возможности
Создание строк
#![allow(unused)] fn main() { // Пустая строка let s = String::new(); // Из строкового литерала let s = String::from("hello"); // Из символа let s = String::from('c'); // Повторение символа let s = "a".repeat(5); // "aaaaa" }
Модификация строк
#![allow(unused)] fn main() { let mut s = String::from("foo"); // Добавление строки s.push_str("bar"); // Добавление символа s.push('!'); // Вставка строки s.insert_str(0, "start "); // Очистка s.clear(); }
Получение информации
#![allow(unused)] fn main() { let s = String::from("hello"); // Длина в байтах let len = s.len(); // 5 // Проверка на пустоту let is_empty = s.is_empty(); // false // Доступ к символам for c in s.chars() { println!("{}", c); } // Доступ к байтам for b in s.bytes() { println!("{}", b); } }
Сравнение строк
#![allow(unused)] fn main() { let s1 = String::from("hello"); let s2 = String::from("world"); assert!(s1 != s2); assert!(s1 == "hello"); }
Особенности UTF-8
Поскольку String всегда содержит валидные UTF-8 данные, индексация по байтам может быть небезопасной:
#![allow(unused)] fn main() { let s = String::from("hello"); // Получение среза (только если границы символов) let slice = &s[0..4]; // "hell" // Итерация по символам - безопасный способ for (i, c) in s.char_indices() { println!("{}: {}", i, c); } }
Производительность
String реализована как вектор байт (Vec<u8>) с гарантией валидности UTF-8:
- Быстрые операции добавления в конец
- Эффективное использование памяти
- Гарантия безопасности памяти
Распространенные ошибки
#![allow(unused)] fn main() { // НЕВЕРНО - индексация может привести к панике // let c = s[0]; // ВЕРНО - используйте итераторы if let Some(c) = s.chars().next() { println!("Первый символ: {}", c); } }
Модуль string предоставляет мощный и безопасный API для работы с текстовыми данными в Rust, сочетающий производительность с гарантиями безопасности типов.