我在 Rust 中有一个 for 循环,在满足的条件下我想重新运行循环的一部分。例如:
for mut n in 0..vector.len(){
...
if condition {
n = 3;
}
}
Run Code Online (Sandbox Code Playgroud)
但在下一次迭代中n
不是 3,循环继续。有任何想法吗?
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 风格的循环每次都会检查它,最后一个示例也会在为condition
true 时检查它。如果您更改向量的大小,您可能应该同时vector.push(...)
纠正range = n..vector.len()
上限。
归档时间: |
|
查看次数: |
1453 次 |
最近记录: |