Структура 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.