Rust 使用“.”循环中的循环变量会导致类型转换吗?

Rust 使用“.”循环中的循环变量会导致类型转换吗?,rust,Rust,我有一个非常简单的定时循环,可以让用户。。最大限度地。但是,当我在这里使用块内的循环变量作为索引时,它似乎会导致变量类型发生更改。如果我不接触循环变量,则秒表没有问题 let sw = Stopwatch::start_new(); let all_data = vec!["a", "b", "c", "d", "e"]; let iters = 2; for x in 0..iters { println!("Message: {:?}", all_data[x]); } printl

我有一个非常简单的定时循环,可以让用户。。最大限度地。但是,当我在这里使用块内的循环变量作为索引时,它似乎会导致变量类型发生更改。如果我不接触循环变量,则秒表没有问题

let sw = Stopwatch::start_new();
let all_data = vec!["a", "b", "c", "d", "e"];
let iters = 2;
for x in 0..iters {
    println!("Message: {:?}", all_data[x]);
}
println!("Thing took {}ms per", sw.elapsed_ms() / iters);
这会在打印经过的时间时给我一个类型错误。它似乎已更改为usize

不过,我可以通过使用所有_data[x as usize]来解决这个问题。Rust实际上是在以某种方式改变实际变量,还是类型推断只是采用最后一种用法并假设该类型

src/main.rs:95:55: 95:58 error: mismatched types [E0308]
src/main.rs:95     println!("Thing took {}ms per", sw.elapsed_ms() / iters);
                                                                     ^~~
<std macros>:2:27: 2:58 note: in this expansion of format_args!
<std macros>:3:1: 3:54 note: in this expansion of print! (defined in <std macros>)
src/main.rs:95:5: 95:60 note: in this expansion of println! (defined in <std macros>)
src/main.rs:95:55: 95:58 help: run `rustc --explain E0308` to see a detailed explanation
src/main.rs:95:55: 95:58 note: expected type `i64`
src/main.rs:95:55: 95:58 note:    found type `usize`
src/main.rs:95:37: 95:58 error: the trait bound `i64: std::ops::Div<usize>` is not satisfied [E0277]
src/main.rs:95     println!("Thing took {}ms per", sw.elapsed_ms() / iters);
x是什么类型的

let没有指定类型,裸2可以是任何类型的整数,所以。。。我不知道

裸0可以是任何类型的整数,所以。。。我不知道

哈哈!Vec上只有一个可用的索引实现,它是Index,这意味着x必须是usize,这意味着0..iters必须是一个范围,这意味着iters必须是usize

但是如果你不使用它

嗯,我从来没有得到任何关于x的类型的指示,而且它一定有一个类型,所以。。。i32*耸耸肩*


在没有更确切的推断信息的情况下,整数类型默认为i32。通过使用它为Vec编制索引,您告诉Rust它应该是一个usize。

这个故事听起来有点卑鄙,直到您将其解读为Rust编译器的想法!我假设该类型将从第一次赋值中推断出来,而不是从以后使用派生变量中推断出来。第一个赋值是i32。然后使用循环变量将外部变量类型更改为兼容的类型。这对我来说似乎真的很奇怪,至少非常令人困惑,但像往常一样,可能有一个很好的理由。好啊去算算生命!为了澄清,我在任何地方都做过类似var x=3的工作;将X设为整数类型,与int X=3;的文本替换相同;。推论是一种方便。我猜rustc正在做更多的工作,这种方法支持其他更复杂的用例,这是很好的理由。我倾向于孤立地思考这句话在做什么,这个表达式的计算结果是什么,我认为这是混乱的根源。我仍然很难理解为什么这是好的,但仅仅知道这是1/2的战斗。@AndrewBacker在Rust中,类型信息可以在代码中反向流动。换一种说法:某种东西的类型可以根据它的使用方式推断出来。这就是为什么Road可以有返回类型演绎,比如C++之类的东西可以。这也解释了为什么我要把一个函数从一个上下文复制到另一个上下文中。它知道函数的返回类型,因此推断最终表达式的类型参数。。。哇!哎哟。现在需要考虑的事情很多。@AndrewBacker如果你想了解更多关于类型推断系统生锈的信息,请使用与相同的方法,例如Haskell Wikipedia上有一篇好文章:
let iters = 2;
0..iters
all_data[x]