你怎么在Rust做一个范围?

mca*_*dre 25 loops for-loop range rust

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

nej*_*omo 25

从1.0开始,for循环使用具有Iterator特征的类型值.这是与for循环相关的教程:

https://doc.rust-lang.org/book/second-edition/ch03-05-control-flow.html#looping-through-a-collection-with-for

以及更多细节

http://doc.rust-lang.org/nightly/book/iterators.html

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

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

示例围栏:

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

    for sptr in strs.iter() {
        println!("{}", sptr);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您只想迭代一系列数字,就像在C的Iterator循环中一样,您可以使用以下for语法创建数值范围:

for i in 0..3 {
    println!("{}", i);
}
Run Code Online (Sandbox Code Playgroud)

如果您需要索引和数组中的元素,那么获得该a..b方法的惯用方法是使用以下方法:

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

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

笔记:

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

    for &s in strs.iter() {
        println!("{}", s);
    }
    
    Run Code Online (Sandbox Code Playgroud)


Lin*_*per 11

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

迭代向量时,请for改为使用.

for elt in ["red", "green", "blue"] {
   std::io::println(elt);
}
Run Code Online (Sandbox Code Playgroud)

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

range(0u, 64u, {|i| C[i] = A[i] + B[i]});
Run Code Online (Sandbox Code Playgroud)

Rust用于支持这种等效的语法,但后来被删除了:

range(0u, 64u) {|i|
    C[i] = A[i] + B[i];
}
Run Code Online (Sandbox Code Playgroud)

  • @mcandre实际上,Ruby风格的块语法`{| args | body}用于表示闭包而不仅仅是函数.它也非常方便简化匿名函数的使用,因为你可能会看到它们在Javascript中使用,因为任何接受闭包作为其最后一个参数的函数(例如回调函数)都可以在函数调用之后编写,如上面Lindsey的第三个例子.最后,即使Rust有几种不同类型的闭包,Rust也可以在使用块语法时推断出你想要的闭包类型.另请参见http://doc.rust-lang.org/doc/tutorial.html#closures (2认同)

con*_*d00 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),但是提交了一个拉取请求来解决此问题.

  • 标识符歧义已在https://github.com/rust-lang/rust/pull/21374中修复 (2认同)

小智 5

let range = (start..end).collect::<Vec<i32>>();
Run Code Online (Sandbox Code Playgroud)