【问题标题】:How do you make a range in Rust?你如何在 Rust 中创建一个范围?
【发布时间】:2012-03-05 12:44:15
【问题描述】:

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

【问题讨论】:

标签: loops for-loop range rust


【解决方案1】:
let range = (start..end).collect::<Vec<i32>>();

【讨论】:

    【解决方案2】:

    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),但提交了a pull request 来解决此问题。

    【讨论】:

    【解决方案3】:

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

    本书在chapter 3.5chapter 13.2 中描述了这种技术。

    如果您对 for 循环的运行方式感兴趣,请参阅 Module std::iter 中描述的语法糖。

    例子:

    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);
        }
    }
    

    注意事项:

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

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

    【讨论】:

    • 如何为0..3制作rev?
    • @EvgeniNabokov 加括号:for i in (0..3).rev() { // Code here... } 参考:doc.rust-lang.org/book/ch03-05-control-flow.html
    • 我如何将i 变成u8?我做了for i: u8 in 0..26 {,但它不起作用。
    • 为什么这不是最佳答案,尽管它是投票最多且被接受的答案? SO以奇怪的方式工作..
    【解决方案4】:

    实际上,本教程的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];
    }
    

    【讨论】:

    • 谢谢!我很好奇为什么 Rust 有两种不同的函数定义和块语法。似乎他们可以通过重用 fn(args...) 而不是 |args| 来节省编码器的麻烦。
    • @mcandre 实际上,Ruby 样式的块语法{|args| body} 用于表示闭包而不仅仅是一个函数。这对于简化匿名函数的使用也非常方便,因为您可能会看到它们在 Javascript 中使用,因为任何接受闭包作为其最后一个参数的函数(例如回调)都可以在函数调用 之后编写,如上面 Lindsey 的第三个示例。最后,尽管 Rust 有几种不同类型的闭包,但 Rust 可以在使用块语法时推断出你想要的闭包类型。另见doc.rust-lang.org/doc/tutorial.html#closures
    • 这还能用吗?我无法获取范围(n,n){|i| ...} 编译。我收到奇怪的错误。
    • 从 rust 0.6 开始,对于 int::range() |i| { C[i] = A[i] + B[i]; } 应该管用。 for 是语法糖,将闭包作为参数传递给 iirc。
    【解决方案5】:

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

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

    似乎不再受支持。

    【讨论】:

      【解决方案6】:

      使用int::range

      【讨论】:

      • 如果有 int 类型,现在已弃用。
      • 他是对的。它已被删除,因此此答案已过时。
      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 2015-12-07
      相关资源
      最近更新 更多