在 Rust 中使用范围修改“for”循环内的索引

Sha*_*tia 5 for-loop rust

我正在查看一些如下所示的代码:

for mut i in 2..points.len() {
    // Do something
    if some_condition {
        i += 1;
    }


}
Run Code Online (Sandbox Code Playgroud)

它编译并运行良好(看起来)。我的第一直觉是,将其作为循环会更好while。然后我开始想,这在 Rust 中一般是合法的吗?如果增量i超出范围会发生什么?我猜显然有麻烦......

我想知道在修改索引时是否存在任何问题。我假设该值i保持在范围内,但我有兴趣知道当它超出该范围时会发生什么。

Frx*_*rem 8

你的代码

for mut i in 2..points.len() {
    // Do something
    if some_condition {
        i += 1;
    }
}
Run Code Online (Sandbox Code Playgroud)

将在编译器内部使用 , 以更简单的术语重写loop为如下所示:

let mut iter = (2..points.len()).into_iter();
loop {
    if let Some(mut i) = iter.next() {
        // Do something
        if some_condition {
            i += 1;
        }
    } else {
        break
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种形式中,希望应该更清楚这里实际发生的情况:i在循环体内声明,并在每次迭代开始时从范围迭代器中分配下一个值。如果您修改它,它将在下一次迭代中重新分配。具体来说,您无法进行更改i以影响循环当前迭代之外的任何内容。