Структура Drain<'a>

Описание

Итератор дренажа для String.

Эта структура создается методом drain для String. Смотрите его документацию для получения дополнительной информации.

Синтаксис

#![allow(unused)]
fn main() {
pub struct Drain<'a> { /* приватные поля */ }
}

Методы

as_str

#![allow(unused)]
fn main() {
pub fn as_str(&self) -> &str
}

Возвращает оставшуюся (под)строку этого итератора как срез.

Доступность: 1.55.0

Примеры

#![allow(unused)]
fn main() {
let mut s = String::from("abc");
let mut drain = s.drain(..);
assert_eq!(drain.as_str(), "abc");
let _ = drain.next().unwrap();
assert_eq!(drain.as_str(), "bc");
}

Реализации трейтов

AsRef<[u8]> и AsRef<str>

#![allow(unused)]
fn main() {
impl<'a> AsRef<[u8]> for Drain<'a>
impl<'a> AsRef<str> for Drain<'a>
}

Позволяют преобразование в срез байт и строковый срез соответственно.

Debug

#![allow(unused)]
fn main() {
impl Debug for Drain<'_>
}

Позволяет форматирование Drain для отладки.

DoubleEndedIterator

#![allow(unused)]
fn main() {
impl DoubleEndedIterator for Drain<'_>
}

Реализует двустороннюю итерацию по символам строки.

Основные методы:

  • next_back() - удаляет и возвращает элемент с конца итератора
  • nth_back() - возвращает n-й элемент с конца
  • try_rfold() - версия try_fold с конца
  • rfold() - сокращает элементы с конца
  • rfind() - поиск с конца

Drop

#![allow(unused)]
fn main() {
impl Drop for Drain<'_>
}

Реализует деструктор для Drain. При удалении итератора оставшаяся часть строки становится доступной.

Iterator

#![allow(unused)]
fn main() {
impl Iterator for Drain<'_>
}

Реализует основную функциональность итератора.

Ассоциированный тип:

#![allow(unused)]
fn main() {
type Item = char
}

Тип элементов, по которым происходит итерация - символы (char).

Основные методы:

  • next() - продвигает итератор и возвращает следующее значение
  • size_hint() - возвращает границы оставшейся длины итератора
  • last() - возвращает последний элемент

Методы трансформации:

  • map() - преобразует элементы
  • filter() - фильтрует элементы
  • take() - берет первые n элементов
  • skip() - пропускает первые n элементов
  • enumerate() - добавляет счетчик итераций

Методы агрегации:

  • fold() - свертывает элементы в аккумулятор
  • reduce() - сокращает элементы до одного
  • sum() - суммирует элементы
  • product() - перемножает элементы

Методы поиска:

  • find() - ищет элемент по предикату
  • position() - ищет позицию элемента
  • all() - проверяет, все ли элементы удовлетворяют предикату
  • any() - проверяет, есть ли хотя бы один элемент, удовлетворяющий предикату

FusedIterator

#![allow(unused)]
fn main() {
impl FusedIterator for Drain<'_>
}

Гарантирует, что после исчерпания итератор всегда будет возвращать None.

Send и Sync

#![allow(unused)]
fn main() {
impl Send for Drain<'_>
impl Sync for Drain<'_>
}

Drain может быть передан между потоками и использован из нескольких потоков.

Автоматические реализации трейтов

  • Freeze for Drain<'a> - может быть заморожен
  • RefUnwindSafe for Drain<'a> - безопасен для паники
  • Unpin for Drain<'a> - может быть безопасно перемещено
  • UnwindSafe for Drain<'a> - безопасен для паники

Примеры использования

Базовое использование

#![allow(unused)]
fn main() {
let mut s = String::from("hello world");
let mut drain = s.drain(2..7);

assert_eq!(drain.next(), Some('l'));
assert_eq!(drain.next(), Some('l'));
assert_eq!(drain.next(), Some('o'));
assert_eq!(drain.as_str(), " w"); // оставшаяся часть
}

Дренаж с преобразованием

#![allow(unused)]
fn main() {
let mut s = String::from("123");
let collected: String = s.drain(..).collect();
assert_eq!(collected, "123");
assert_eq!(s, ""); // исходная строка опустошена
}

Двусторонняя итерация

#![allow(unused)]
fn main() {
let mut s = String::from("abcd");
let mut drain = s.drain(..);

assert_eq!(drain.next(), Some('a'));
assert_eq!(drain.next_back(), Some('d'));
assert_eq!(drain.next(), Some('b'));
assert_eq!(drain.next_back(), Some('c'));
assert_eq!(drain.next(), None);
}

Особенности поведения

  • При создании Drain заимствует исходную строку
  • Удаленные символы извлекаются из строки
  • При удалении Drain оставшаяся часть строки сдвигается
  • Итератор эффективно работает с UTF-8 символами
  • Поддерживает произвольные диапазоны дренажа

Производительность

Drain обеспечивает эффективное удаление диапазона символов из строки без лишних аллокаций памяти, работая непосредственно с внутренним буфером String.