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

时间:2016-07-25 04:18:10

标签: 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]);
}
println!("Thing took {}ms per", sw.elapsed_ms() / iters);

打印出已用时间时,这会给我一个类型错误。它似乎已更改为usize

我可以使用all_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);

1 个答案:

答案 0 :(得分:10)

x是什么类型的?

let iters = 2;

好吧,let没有指定类型,而2只能任何类型的整数,所以...... 我不知道。

0..iters

嗯,裸0可能是任何类整数,所以... 我不知道。

all_data[x]

A-ha!Index上只能使用Vec一个实现,而且它是&#39} Index<usize>,表示x 必须usize,这意味着0..iters 必须Range<usize> },表示iters 必须usize

(但如果你不使用它......)

好吧,我从来没有说明x的类型是什么,它必须拥有类型,所以...... i32? * 耸肩 *

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