如何在Rust的for循环中使用多个变量?
问题描述:
在C语言家族,我能做到这一点的一条线:如何在Rust的for循环中使用多个变量?
for(int i = lo, int j = mid+1; i <= mid && j <= hi; i++, j++){
...
}
但在除锈......我只能写这样的:
for i in lo..mid+1 {
let mut j = mid+1;
if j <= hi {
break;
}
...
j += 1;
}
是否有一个更有效这种方式来实现?
使用迭代器适用于上面,而是使用迭代器使得一些场合,例如使用算术麻烦,如
for (int i = 0; i < n; i ++) {
if (a[i] == ...) {
i += 5;
}
}
生锈,这是行不通的。可变i
不会被5递增,但由1代替:
for i in 0..n {
if a[i] == ... {
i += 5;
}
}
答
可以创建两个平行范围的迭代器,zip
它们,然后迭代虽然组合:
fn main() {
let values = [10, 20, 30, 40, 50, 60, 70, 80, 90];
let lo = 2;
let mid = 5;
let hi = 7;
let early_indexes = lo..(mid + 1);
let late_indexes = (mid + 1)..(hi + 1);
for (i, j) in early_indexes.zip(late_indexes) {
println!("{}, {}", i, j);
println!("{} - {}", values[i], values[j]);
}
}
总有一天,包含范围为will be stabilized,你应该可以这样(取决于最终的语法):
let early_indexes = lo...mid;
let late_indexes = (mid + 1)...hi;
for (i, j) in early_indexes.zip(late_indexes) {
println!("{}, {}", i, j);
println!("{} - {}", values[i], values[j]);
}
如果你实际上是迭代虽然片,因为我已经证明我的例子,你也可以只是两个迭代器直接结合而忽略指数:
let early_values = values[lo..(mid + 1)].iter();
let late_values = values[(mid + 1)..(hi + 1)].iter();
for (i, j) in early_values.zip(late_values) {
println!("{}, {}", i, j);
}
变量
i
不会增加5,但增加1。
是的,增加一个步骤是烦人的,有一天it will also be stabilized。在此期间:
- What is a stable way to iterate on a range with custom step?
- How do I iterate over a range with a custom step?
如果您需要完全控制,你可以随时使用while
或loop
:
let mut i = 0;
while i < n {
if a[i] == ... {
i += 5;
}
i += 1;
}
+0
感谢您解决我的问题的详细说明! 〜 – wind2412
谢谢〜它的工作原理。 Rust的for循环使用迭代器,这使得使用算术等一些场合变得有点麻烦。正如'for(int i = 0; i
wind2412