如何在 Rust 的 for 循环中使用多个变量?

7
在 C 系列语言中,我可以在一行代码中完成这个操作:
for(int i = lo, int j = mid+1; i <= mid && j <= hi; i++, j++){
    ...
}

但在Rust中,我只能像这样编写代码:
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;
    }
}

在 Rust 中,这种做法是行不通的。变量 i 不会增加5,而只会增加1:
for i in 0..n {
    if a[i] == ... {
        i += 5;
    }
} 

谢谢~ 它起作用了。Rust的for循环使用迭代器,这使得一些情况下使用算术运算有点麻烦。就像 for (int i = 0; i < n; i ++) if (a[i] == ...) i += 5;。在 Rust 中,它使用迭代器,所以 for i in 0..n{ if a[i] == ... { i+=5; }} 不起作用。变量 i 下一次不会加 5,而是加 1... - wind2412
1个回答

8
你可以创建两个并行的范围迭代器,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]);
    }
}

有一天,包含范围将被稳定下来,并且你应该能够像这样做(取决于最终的语法):

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。

是的,按步长递增很麻烦,有一天 它也会稳定下来。在此期间:

如果你需要完全控制,你总可以使用 whileloop

let mut i = 0;
while i < n {
    if a[i] == ... {
        i += 5;
    }

    i += 1;
}

1
谢谢您详细的解释,解决了我的问题!~ - wind2412

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接