1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use crate::iter::TrustedLen;

/// [`TrustedLen`] 不能有方法,所以这允许扩充它。
///
/// 它目前需要 `TrustedLen`,因为尚不清楚依赖 `size_hint` 是否合理。
///
pub(crate) trait UncheckedIterator: TrustedLen {
    /// 从非空迭代器获取下一项。
    ///
    /// 因为总是有一个值要返回,这意味着它可以直接返回 `Item` 类型,而无需将其包装在 `Option` 中。
    ///
    /// # Safety
    ///
    /// 这只能在 `size_hint().0 != 0` 时调用,保证至少有一项可用。
    ///
    /// 否则 (也就是当 `size_hint ().1 == Some(0)`) 时,这是 UB。
    ///
    /// # 给实现者的注意事项
    ///
    /// 这有一个使用 [`Option::unwrap_unchecked`] 的默认实现。
    /// 如果您的 `next`*总是*返回 `Some`,这可能就足够了,例如对于无限迭代器。
    /// 然而,在更复杂的情况下,有时 `Option` 处理中的 IR 中仍会残留 `insertvalue`/`assume`/`extractvalue` 指令,此时您可能希望手动实现它。
    ///
    ///
    ///
    ///
    ///
    #[unstable(feature = "trusted_len_next_unchecked", issue = "37572")]
    #[inline]
    unsafe fn next_unchecked(&mut self) -> Self::Item {
        let opt = self.next();
        // SAFETY: 调用者承诺我们不是空的,`Self: TrustedLen` 所以我们实际上可以信任 `size_hint`。
        //
        unsafe { opt.unwrap_unchecked() }
    }
}