РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
684 of 1245 menu

Трейт FusedIterator

Трейт FusedIterator - это маркерный трейт из модуля std::iter, который гарантирует, что после того, как итератор вернул None, все последующие вызовы метода next также будут возвращать None. Это свойство называется «fused» (от англ. fused - «сплавленный», «соединённый»). Трейт не имеет собственных методов - он служит только маркером для компилятора и для других обобщённых алгоритмов, которые полагаются на такое поведение.

Многие стандартные итераторы Rust уже реализуют FusedIterator, например, Range, Empty, Once, а также адаптеры Map, Filter, Take, Chain и другие. Если вы пишете собственный итератор и хотите гарантировать такое поведение, вы можете реализовать этот трейт вручную.

Синтаксис

impl FusedIterator for MyIterator {}

Пример

Проверим, что стандартный итератор Range реализует FusedIterator:

use std::iter::FusedIterator; fn check_fused<I: FusedIterator>(_iter: I) -> bool { true } fn main() { let iter = 1..3; let res = check_fused(iter); println!("{}", res); }

Результат выполнения кода:

true

Пример

Убедимся, что после возврата None итератор продолжает возвращать None:

fn main() { let mut iter = 1..3; println!("{:?}", iter.next()); println!("{:?}", iter.next()); println!("{:?}", iter.next()); println!("{:?}", iter.next()); }

Результат выполнения кода:

Some(1) Some(2) None None

Пример

Создадим собственный итератор и реализуем для него FusedIterator:

use std::iter::FusedIterator; struct Counter { count: u32, max: u32, } impl Iterator for Counter { type Item = u32; fn next(&mut self) -> Option<Self::Item> { if self.count < self.max { self.count += 1; Some(self.count) } else { None } } } impl FusedIterator for Counter {} fn main() { let mut iter = Counter { count: 0, max: 2 }; println!("{:?}", iter.next()); println!("{:?}", iter.next()); println!("{:?}", iter.next()); println!("{:?}", iter.next()); }

Результат выполнения кода:

Some(1) Some(2) None None

Смотрите также

  • трейт Iterator,
    который является базовым для всех итераторов
  • метод fuse,
    который превращает любой итератор в fused-итератор
  • трейт ExactSizeIterator,
    который гарантирует точный размер итератора
  • трейт DoubleEndedIterator,
    который позволяет обходить итератор с обоих концов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить