改变循环 Rust 中的运行变量

Nik*_*kis 3 rust

我在 Rust 中有一个 for 循环,在满足的条件下我想重新运行循环的一部分。例如:

for mut n in 0..vector.len(){
...
   if condition {
      n = 3;
  }
}
Run Code Online (Sandbox Code Playgroud)

但在下一次迭代中n不是 3,循环继续。有任何想法吗?

use*_*342 6

for n in 0..x分配n从 0 到(但不包括)的值,x而不考虑 的突变(n如果发生)。在具有 foreach 样式迭代的其他语言中就是这种情况,例如在 Python 中使用for n in range(len(vector)),或者在 C++20 中使用for (auto n: std::views::iota(0, vector.size()))

如果您偶尔需要返回到以前的状态(如 C 提供的那样)for (n = 0; n < x; n++),最简单的选择是只编写 C 样式循环:

let mut n = 0;
while n < vector.len() {
    ...
    if condition {
        n = 3;
        continue;
    }
    n += 1;
}
Run Code Online (Sandbox Code Playgroud)

缺点是n += 1被埋在循环末尾,因此continue只想继续循环(不重置循环计数器)的 a 实际上无法递增n。如果这让你烦恼(而且它也会让我烦恼),你可以切换到稍微不同的基于 foreach 的实现,其中范围是明确的。您不用使用 with 来for循环遍历范围while let。这为您提供了 foreach 的稳健性,同时允许您修改从循环内部循环的范围:

let mut range = 0..vector.len();
while let Some(n) = range.next() {
    ...
    if condition {
        range = 3..vector.len();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您的原始代码vector.len()仅评估一次。C 风格的循环每次都会检查它,最后一个示例也会在为conditiontrue 时检查它。如果您更改向量的大小,您可能应该同时vector.push(...)纠正range = n..vector.len()上限。