Trait core::iter::ExactSizeIterator

1.0.0 · source ·
pub trait ExactSizeIterator: Iterator {
    // Provided methods
    fn len(&self) -> usize { ... }
    fn is_empty(&self) -> bool { ... }
}
Expand description

知道其确切长度的迭代器。

许多 Iterator 不知道它们将迭代多少次,但是有些迭代器知道。 如果迭代器知道可以迭代多少次,则提供对该信息的访问将很有用。 例如,如果要向后迭代,一个好的开始就是知道终点在哪里。

实现 ExactSizeIterator 时,还必须实现 Iterator。 这样做时,Iterator::size_hint 的实现 必须 返回迭代器的确切大小。

len 方法具有默认实现,因此通常不应该实现它。 但是,您可能能够提供比默认设置更有效的实现,因此在这种情况下将其覆盖是有道理的。

请注意,此 trait 是安全的 trait,因此 notcannot 不能保证返回的长度正确。 这意味着 unsafe 代码一定不要依赖 Iterator::size_hint 的正确性。 不稳定且不安全的 TrustedLen trait 提供了此额外的保证。

什么时候不应该适配器是 ExactSizeIterator?

如果适配器使迭代器更长,那么该适配器实现 ExactSizeIterator 通常是不正确的。 内部精确大小的迭代器可能已经是 usize::MAX-long,因此更长的适配迭代器的长度将不再能在 usize 中精确表示。

这就是 Chain<A, B> 不是 ExactSizeIterator 的原因,即使 AB 都是 ExactSizeIterator

Examples

基本用法:

// 一个有限的范围确切地知道它将迭代多少次
let five = 0..5;

assert_eq!(5, five.len());
Run

模块级文档 中,我们实现了 IteratorCounter。 让我们也为其实现 ExactSizeIterator

impl ExactSizeIterator for Counter {
    // 我们可以轻松计算剩余的迭代次数。
    fn len(&self) -> usize {
        5 - self.count
    }
}

// 现在我们可以使用它了!

let mut counter = Counter::new();

assert_eq!(5, counter.len());
let _ = counter.next();
assert_eq!(4, counter.len());
Run

Provided Methods§

source

fn len(&self) -> usize

返回迭代器的确切剩余长度。

该实现可确保迭代器在返回 None 之前,将返回 Some(T) 值的次数正好多于 len()

此方法具有默认实现,因此通常不应直接实现它。 但是,如果您可以提供更有效的实现,则可以这样做。 有关示例,请参见 trait-level 文档。

该函数与 Iterator::size_hint 函数具有相同的安全保证。

Examples

基本用法:

// 一个有限的范围确切地知道它将迭代多少次
let mut range = 0..5;

assert_eq!(5, range.len());
let _ = range.next();
assert_eq!(4, range.len());
Run
source

fn is_empty(&self) -> bool

🔬This is a nightly-only experimental API. (exact_size_is_empty #35428)

如果迭代器为空,则返回 true

此方法具有使用 ExactSizeIterator::len() 的默认实现,因此您无需自己实现。

Examples

基本用法:

#![feature(exact_size_is_empty)]

let mut one_element = std::iter::once(0);
assert!(!one_element.is_empty());

assert_eq!(one_element.next(), Some(0));
assert!(one_element.is_empty());

assert_eq!(one_element.next(), None);
Run

Implementors§

source§

impl ExactSizeIterator for core::ascii::EscapeDefault

1.20.0 · source§

impl ExactSizeIterator for EscapeDebug

1.11.0 · source§

impl ExactSizeIterator for core::char::EscapeDefault

1.11.0 · source§

impl ExactSizeIterator for EscapeUnicode

1.35.0 · source§

impl ExactSizeIterator for ToLowercase

1.35.0 · source§

impl ExactSizeIterator for ToUppercase

source§

impl ExactSizeIterator for Range<i8>

source§

impl ExactSizeIterator for Range<i16>

source§

impl ExactSizeIterator for Range<i32>

source§

impl ExactSizeIterator for Range<isize>

source§

impl ExactSizeIterator for Range<u8>

source§

impl ExactSizeIterator for Range<u16>

source§

impl ExactSizeIterator for Range<u32>

source§

impl ExactSizeIterator for Range<usize>

1.26.0 · source§

impl ExactSizeIterator for RangeInclusive<i8>

1.26.0 · source§

impl ExactSizeIterator for RangeInclusive<i16>

1.26.0 · source§

impl ExactSizeIterator for RangeInclusive<u8>

1.26.0 · source§

impl ExactSizeIterator for RangeInclusive<u16>

source§

impl ExactSizeIterator for Bytes<'_>

1.1.0 · source§

impl<'a, I, T> ExactSizeIterator for Cloned<I>where I: ExactSizeIterator<Item = &'a T>, T: Clone + 'a,

1.36.0 · source§

impl<'a, I, T> ExactSizeIterator for Copied<I>where I: ExactSizeIterator<Item = &'a T>, T: Copy + 'a,

1.31.0 · source§

impl<'a, T> ExactSizeIterator for RChunksExact<'a, T>

source§

impl<A> ExactSizeIterator for core::option::IntoIter<A>

source§

impl<A> ExactSizeIterator for core::option::Iter<'_, A>

source§

impl<A> ExactSizeIterator for core::option::IterMut<'_, A>

source§

impl<A, B> ExactSizeIterator for Zip<A, B>where A: ExactSizeIterator, B: ExactSizeIterator,

1.43.0 · source§

impl<A, F: FnOnce() -> A> ExactSizeIterator for OnceWith<F>

source§

impl<B, I: ExactSizeIterator, F> ExactSizeIterator for Map<I, F>where F: FnMut(I::Item) -> B,

source§

impl<I> ExactSizeIterator for Enumerate<I>where I: ExactSizeIterator,

source§

impl<I> ExactSizeIterator for Fuse<I>where I: ExactSizeIterator,

source§

impl<I> ExactSizeIterator for Rev<I>where I: ExactSizeIterator + DoubleEndedIterator,

source§

impl<I> ExactSizeIterator for Skip<I>where I: ExactSizeIterator,

1.28.0 · source§

impl<I> ExactSizeIterator for StepBy<I>where I: ExactSizeIterator,

source§

impl<I> ExactSizeIterator for Take<I>where I: ExactSizeIterator,

source§

impl<I, const N: usize> ExactSizeIterator for core::iter::ArrayChunks<I, N>where I: ExactSizeIterator,

source§

impl<I: ExactSizeIterator + ?Sized> ExactSizeIterator for &mut I

source§

impl<I: ExactSizeIterator> ExactSizeIterator for Peekable<I>

source§

impl<I: ExactSizeIterator, F> ExactSizeIterator for Inspect<I, F>where F: FnMut(&I::Item),

source§

impl<T> ExactSizeIterator for core::result::IntoIter<T>

source§

impl<T> ExactSizeIterator for core::result::Iter<'_, T>

source§

impl<T> ExactSizeIterator for core::result::IterMut<'_, T>

source§

impl<T> ExactSizeIterator for Chunks<'_, T>

1.31.0 · source§

impl<T> ExactSizeIterator for ChunksExact<'_, T>

1.31.0 · source§

impl<T> ExactSizeIterator for ChunksExactMut<'_, T>

source§

impl<T> ExactSizeIterator for ChunksMut<'_, T>

source§

impl<T> ExactSizeIterator for core::slice::Iter<'_, T>

source§

impl<T> ExactSizeIterator for core::slice::IterMut<'_, T>

1.31.0 · source§

impl<T> ExactSizeIterator for RChunks<'_, T>

1.31.0 · source§

impl<T> ExactSizeIterator for RChunksExactMut<'_, T>

1.31.0 · source§

impl<T> ExactSizeIterator for RChunksMut<'_, T>

source§

impl<T> ExactSizeIterator for Windows<'_, T>

1.2.0 · source§

impl<T> ExactSizeIterator for Empty<T>

1.2.0 · source§

impl<T> ExactSizeIterator for Once<T>

1.40.0 · source§

impl<T, const N: usize> ExactSizeIterator for core::array::IntoIter<T, N>

source§

impl<T, const N: usize> ExactSizeIterator for core::slice::ArrayChunks<'_, T, N>

source§

impl<T, const N: usize> ExactSizeIterator for ArrayChunksMut<'_, T, N>

source§

impl<T, const N: usize> ExactSizeIterator for ArrayWindows<'_, T, N>