Function std::iter::from_fn

1.34.0 · source ·
pub fn from_fn<T, F>(f: F) -> FromFn<F> where
    F: FnMut() -> Option<T>,
Expand description

创建一个新的迭代器,每次迭代都调用提供的闭包 F: FnMut() -> Option<T>

这允许创建具有任何行为的自定义迭代器,而无需使用更冗长的语法来创建专用类型并为其实现 Iterator trait。

请注意,FromFn 迭代器不会对闭包的行为进行假设,因此保守地不会实现 FusedIterator,也不会从默认 (0, None) 覆盖 Iterator::size_hint()

闭包可以使用捕获及其环境来跟踪迭代之间的状态。根据迭代器的使用方式,这可能需要在闭包上指定 move 关键字。

Examples

让我们从 模块级文档 重新实现计数器迭代器:

let mut count = 0;
let counter = std::iter::from_fn(move || {
    // 增加我们的数量。这就是为什么我们从零开始。
    count += 1;

    // 检查我们是否已经完成计数。
    if count < 6 {
        Some(count)
    } else {
        None
    }
});
assert_eq!(counter.collect::<Vec<_>>(), &[1, 2, 3, 4, 5]);
Run