繁体   English   中英

你如何在 Rust 中创建一个范围?

[英]How do you make a range in Rust?

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

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

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

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

例子:

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

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

游乐场

如果您只想迭代一个数字范围,就像在 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); }

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

迭代向量时,使用for代替。

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

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

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

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

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

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) ,但有一个拉取请求提交来解决这个问题。

请注意,从 rustc 0.4(2012 年 10 月)开始,替代构造

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

好像不再支持了。

let range = (start..end).collect::<Vec<i32>>();

使用int::range

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM