Модуль 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, сочетающий производительность с гарантиями безопасности типов.