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

在迭代可变数量的索引时调用表达式中的索引(Python)

Python:分配“通过”迭代器

Python坑:不要使用可变对象作为函数默认值生成器不保留迭代过后的结果嵌套列表创建==和is的区

Leetcode 141题 环形链表(Linked List Cycle) Java语言求解

多个 jQuery Cycle 寻呼机导航

为啥工作人员从主线程创建对象的副本?