Трейт ExactSizeIterator
Трейт ExactSizeIterator является расширением трейта Iterator
и гарантирует, что итератор знает своё точное количество элементов.
Он предоставляет метод len, который возвращает точное число
оставшихся элементов без необходимости перебирать итератор.
Трейт не имеет собственных параметров, но требует, чтобы метод
size_hint возвращал одинаковые значения для нижней и верхней
границы, то есть точное количество элементов.
Синтаксис
impl ExactSizeIterator for MyIterator
{
fn len(&self) -> usize
}
Пример
Давайте получим точное количество элементов вектора
vec![1, 2, 3, 4, 5] с помощью метода len:
fn main()
{
let v = vec![1, 2, 3, 4, 5];
let iter = v.iter();
let res = iter.len();
println!("{}", res);
}
Результат выполнения кода:
5
Пример
Давайте проверим, что после вызова take итератор
всё ещё реализует трейт ExactSizeIterator и возвращает
корректную длину:
fn main()
{
let v = vec![1, 2, 3, 4, 5];
let mut iter = v.iter().take(3);
let res = iter.len();
println!("{}", res);
iter.next();
let res2 = iter.len();
println!("{}", res2);
}
Результат выполнения кода:
3
2
Пример
Давайте убедимся, что ExactSizeIterator позволяет
безопасно использовать метод len вместе с rev:
fn main()
{
let v = vec![1, 2, 3, 4, 5];
let iter = v.iter().rev();
let res = iter.len();
println!("{}", res);
}
Результат выполнения кода:
5
Смотрите также
-
трейт
Iterator,
который является базовым трейтом для всех итераторов -
метод
size_hint,
который возвращает границы количества оставшихся элементов -
трейт
DoubleEndedIterator,
который позволяет перебирать элементы с обоих концов -
метод
count,
который подсчитывает количество элементов в итераторе