是否可以在Rust for循环中声明变量的类型?

时间:2014-06-28 04:43:18

标签: rust

C ++示例:

for (long i = 0; i < 101; i++) {
    //...
}

在Rust中我尝试过:

for i: i64 in 1..100 {
    // ...
}

我可以很容易地在for循环之前声明let i: i64 = var 但我宁愿学习正确的方法,但这导致

error: expected one of `@` or `in`, found `:`
 --> src/main.rs:2:10
  |
2 |     for i: i64 in 1..100 {
  |          ^ expected one of `@` or `in` here

3 个答案:

答案 0 :(得分:17)

您可以在您在该范围内使用的其中一个文字上使用integer suffix。类型推断将完成剩下的工作:

for i in 1i64..101 {
    println!("{}", i);
}

答案 1 :(得分:4)

不,在for循环中声明变量的类型是

相反,更通用的方法(例如也适用于enumerate())是通过解构循环体内的项来引入let绑定。

示例:

for e in bytes.iter().enumerate() {
    let (i, &item): (usize, &u8) = e; // here
    if item == b' ' {
        return i;
    }
}

答案 2 :(得分:0)

如果循环变量恰好是返回通用类型的函数调用的结果,则

let input = ["1", "two", "3"];
for v in input.iter().map(|x| x.parse()) {
    println!("{:?}", v);
}
error[E0284]: type annotations required: cannot resolve `<_ as std::str::FromStr>::Err == _`
 --> src/main.rs:3:37
  |
3 |     for v in input.iter().map(|x| x.parse()) {
  |                                     ^^^^^

您可以使用 turbofish 指定类型:

for v in input.iter().map(|x| x.parse::<i32>()) {
//                                   ^^^^^^^
    println!("{:?}", v);
}

或者您可以使用完全限定的语法

for v in input.iter().map(|x| <i32 as std::str::FromStr>::from_str(x)) {
//                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    println!("{:?}", v);
}

另请参阅:

相关问题