你怎么在Rust做一个范围?

时间:2012-02-14 05:03:32

标签: loops for-loop range rust

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

5 个答案:

答案 0 :(得分:22)

从1.0开始,for循环使用Iterator trait的类型值。

本书在chapter 3.5chapter 13.2中介绍了这项技术。

如果您对循环的操作方式感兴趣,请参阅此处描述的语法糖:

http://doc.rust-lang.org/std/iter/index.html

示例:

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

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

Playground

如果你只想迭代一系列数字,就像在C的for循环中一样,你可以使用a..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);
    }
}

注意:

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

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

答案 1 :(得分:11)

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

  

迭代向量时,请改用for

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

但如果您需要索引,可以使用uint::range function from the core library(或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];
}

答案 2 :(得分: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),但其中{{1}} {{1}} 3}}提交修复此问题。

答案 3 :(得分:2)

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

的替代构造
range(0u, 64u) {|i|
    C[i] = A[i] + B[i];
}

似乎不再受支持了。

答案 4 :(得分:0)

使用int::range