【问题标题】:How to use multiple variables in Rust's for loop?如何在 Rust 的 for 循环中使用多个变量?
【发布时间】:2017-09-04 07:05:29
【问题描述】:

在 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 &lt; n; i ++) if (a[i] == ...) i += 5;。在 rust 中,它使用迭代器,因此 for i in 0..n{ if a[i] == ... { i+=5; }} 不起作用。变量i下一轮不会加5,而是加1...

标签: rust


【解决方案1】:

您可以创建两个并行范围迭代器,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。同时:

如果您需要完全控制,您可以随时使用whileloop

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

    i += 1;
}

【讨论】:

  • 感谢您的详细解释解决了我的问题! ~
猜你喜欢
  • 2021-04-23
  • 2022-11-15
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多