36

文档没有说明如何和教程完全忽略 for 循环。

4

6 回答 6

31

从 1.0 开始,for循环使用具有Iteratortrait的类型的值。

本书在第 3.5 章和第 13.2 章描述了这种技术。

如果您对for循环的操作方式感兴趣,请参阅模块 std::iter中描述的语法糖。

例子:

fn main() {
    let strs = ["red", "green", "blue"];

    for sptr in strs.iter() {
        println!("{}", sptr);
    }
}

游乐场

如果您只想迭代一个数字范围,就像在 C 的fora..b循环中一样,您可以使用以下语法创建一个数字范围:

for i in 0..3 {
    println!("{}", i);
}

如果您需要数组中的索引和元素,则惯用的方法是使用以下Iterator::enumerate方法:

fn main() {
    let strs = ["red", "green", "blue"];

    for (i, s) in strs.iter().enumerate() {
        println!("String #{} is {}", i, s);
    }
}

笔记:

  • 循环项是对迭代元素的借用引用。在这种情况下,元素strs具有类型&'static str——它们是指向静态字符串的借用指针。这意味着sptr有类型&&'static str,所以我们将其取消引用为*sptr。我更喜欢的另一种形式是:

      for &s in strs.iter() {
          println!("{}", s);
      }
    
于 2013-10-02T19:18:51.567 回答
10

实际上,本教程的循环部分确实涵盖了for循环:

迭代向量时,请for改用。

for elt in ["red", "green", "blue"] {
   std::io::println(elt);
}

但是,如果您需要索引,您可以使用uint::range核心库中的函数(或int::rangeu8::rangeu32::rangeu64::range)和 Rust 的块语法来执行以下操作:

range(0u, 64u, {|i| C[i] = A[i] + B[i]});

Rust 曾经支持这种等效语法,但后来被删除:

range(0u, 64u) {|i|
    C[i] = A[i] + B[i];
}
于 2012-02-14T18:40:37.833 回答
10

for i in range(0, 100)现在不赞成使用for i in 0..100(根据rustc 1.0.0-nightly.

另外值得注意的是,当您使用范围内的标识符(例如,for i in 0..a)时,编译器无法消除歧义,因此您必须使用for i in (0..a),但是提交了一个拉取请求来解决此问题。

于 2015-01-13T11:16:58.027 回答
0

请注意,从 rustc 0.4(2012 年 10 月)开始,

range(0u, 64u) {|i|
    C[i] = A[i] + B[i];
}

似乎不再支持。

于 2012-10-31T18:37:48.220 回答
0
let range = (start..end).collect::<Vec<i32>>();
于 2021-12-27T12:36:27.320 回答
-1

使用int::range

于 2012-02-14T05:05:15.350 回答