为什么用cycle()创建的迭代器中的可变值没有更新,即使有停止条件,也会导致无限循环?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么用cycle()创建的迭代器中的可变值没有更新,即使有停止条件,也会导致无限循环?相关的知识,希望对你有一定的参考价值。

考虑程序:

fn main() {
    let mut nums = vec![1, 3];    

    let mut counter = 0;
    for mut p in nums.into_iter().cycle() {
        println!("{}", p);
        p += 1;
        if p > 10 {
            break;
        }

        counter += 1;
        if counter > 1000 {
            println!("ERROR");
            break;
        }
    }
}

我希望打印出1、3、2、4、3、5,...,直到达到10,然后停止。相反,我得到了警告:

warning: variable does not need to be mutable
 --> src/main.rs:2:9
  |
2 |     let mut nums = vec![1, 2, 3];
  |         ----^^^^
  |         |
  |         help: remove this `mut`
  |

然后是一个无限循环(嗯,只有有限的,因为我在其中添加了counter)。为什么这是一个无限循环?


我想要的行为也可以这样写:

for idx in (0..nums.len()).cycle() {
    let p = &mut nums[idx];
    println!("{}", p);
    *p += 1;
    if *p > 10 {
        break;
    }
}

可以,但是我不想遍历索引,我想直接遍历值。有没有办法写我想要的东西?

答案

无限循环是Iterator::cycle存在的原因(强调我的意思:):

重复迭代器无限地

而不是从Iterator::cycle处停止,迭代器将从头重新开始。再次迭代后,它将重新开始。然后再次。然后再次。 永远

以上是关于为什么用cycle()创建的迭代器中的可变值没有更新,即使有停止条件,也会导致无限循环?的主要内容,如果未能解决你的问题,请参考以下文章