Трейт 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,
который позволяет обходить итератор с обоих концов