在不使用时如何去除迭代中的无关(0..)?

How to get rid of extraneous (0..) in iteration when its not used?

提问人:Anopt 提问时间:11/17/2023 最后编辑:Anopt 更新时间:11/18/2023 访问量:66

问:

我想出了以下函数来转置一个:Vec<Vec<T>>

fn transpose<T>(v: Vec<Vec<T>>) -> Vec<Vec<T>> {
    let mut xs = v.into_iter().map(|x| x.into_iter()).collect::<Vec<_>>();
    (0..)
        .map_while(|_| xs.iter_mut().map(|x| x.next()).collect())
        .collect()
}

的值未使用,但锚定迭代器。我可以把任何东西放在那里。但是,是否可以对其进行重组,使其没有无用的迭代器呢?(0..)

Rust 迭代器

评论

0赞 cdhowie 11/18/2023
如果你只需要一个无穷无尽的迭代器,那么你可以使用 .从技术上讲,在产生价值后最终会停止生产物品。(我怀疑你会有一个包含这么多项目的向量,但理论上你甚至没有这个问题,而且你不会浪费时间计算一个你永远不会使用的索引。std::iter::repeat(())0..i32::MAXrepeat
0赞 Anopt 11/18/2023
@cdhowie 是的,这两种方法都有效,但我正在寻找一种方法来完全删除它,因为两者都没有目的。不幸的是,除了在那里拥有一些东西之外,我真的看不到其他方法。(0..)repeat(())

答:

4赞 kmdreko 11/18/2023 #1

您可以使用 std::iter::from_fn

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

fn transpose<T>(v: Vec<Vec<T>>) -> Vec<Vec<T>> {
    let mut xs = v.into_iter().map(|x| x.into_iter()).collect::<Vec<_>>();
    std::iter::from_fn(|| xs.iter_mut().map(|x| x.next()).collect()).collect()
}

评论

0赞 Anopt 11/18/2023
甜蜜的,没想到。