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

mf98qq94  于 2023-01-05  发布在  其他
关注(0)|答案(4)|浏览(172)

C++示例:

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

在《铁 rust 》中,我尝试过:

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

我可以很容易地在for循环之前声明一个let i: i64 =变量,但是我更愿意学习正确的方法,但是这导致了

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
ggazkfy8

ggazkfy81#

你可以在你在范围内使用的一个常量上使用一个整数后缀。类型推断会完成剩下的工作:

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

mbyulnm02#

不,可能在for循环中声明变量的类型。
相反,更一般的方法(例如,也适用于enumerate())是通过在循环体内部解构项来引入let绑定。
示例:

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

brccelvz3#

如果循环变量恰好是返回泛型类型的函数调用的结果:

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

另见:

wa7juj8i

wa7juj8i4#

曾经有一个讨论的地方,这是要求,这是由一个实际的RFC跟进。
不过,讨论似乎被推迟了,因为没有足够的人真正关心这个主题。
目前,如果您确实想要进行注解,最好的选择似乎是:

fn main() {
    let my_vec: Vec<i32> = vec![-1, 22, -333];
    for i in my_vec.iter() {
        let _: &i32 = i;
        println!("{}", i);
    }
}

如您所见,如果类型不匹配,则会失败:
x一个一个一个一个x一个一个二个x
当然,由于自动解引用,该方法不能区分&i32&&i32,这在某些情况下可能是个问题:

fn main() {
    let my_vec: Vec<i32> = vec![-1, 22, -333];
    for i in my_vec.iter() {
        let _: &i32 = &i; // Compiles, but the right side is &&i32
        println!("{}", i);
    }
}

但总的来说,这应该会给潜在的审稿人带来足够的信心,在我看来。

相关问题