gpt4 book ai didi

loops - 为什么不更新使用 cycle() 创建的迭代器的可变值,导致无限循环,尽管有停止条件?

转载 作者:行者123 更新时间:2023-12-03 11:32:10 26 4
gpt4 key购买 nike

考虑程序:

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;
}
}

这行得通 - 但我不想遍历索引,我想直接遍历值。有没有办法写出我想要的东西?

最佳答案

cycle() 迭代器适配器通过克隆迭代器中的每个值来工作,以便它们可以被多次遍历。由于这是在 nums.into_iter() 之上应用的,因此向量被完全消耗并且 p += 1 不会修改保留在循环适配器中的向量。该计划不会因为没有取得任何进展而结束。

您可能需要一个可变引用的迭代器,以便修改向量而不是消耗向量。但是不允许循环可变引用的迭代器,因为适配器需要克隆这些引用,这是非法的。可以以独有方式处理传入项的流式迭代器可能允许您这样做,但如果没有 generic associated types (GATs),这样的 API 将无法使用。 .

一种可能的解决方案是不使用 .cycle():创建一个外部循环多次遍历向量,并在预期条件到达时显式中断该循环。

let mut nums = vec![1, 3];    

let mut counter = 0;

'outer: loop {
for p in nums.iter_mut() {
println!("{}", p);
*p += 1;
if *p > 10 {
break 'outer;
}

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

Playground

关于loops - 为什么不更新使用 cycle() 创建的迭代器的可变值,导致无限循环,尽管有停止条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59253936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com