如何解决“无法索引'usize`类型的值'错误?

时间:2016-12-15 15:44:27

标签: rust

我正在尝试使用以下代码衡量Vec的{​​{1}}索引与[]的速度:

.get(index)

但这会返回以下错误:

extern crate time;

fn main() {
    let v = vec![1; 1_000_000];
    let before_rec1 = time::precise_time_ns();

    for (i, v) in (0..v.len()).enumerate() {
        v[i]
    }
    let after_rec1 = time::precise_time_ns();
    println!("Total time: {}", after_rec1 - before_rec1);


    let before_rec2 = time::precise_time_ns();

    for (i, v) in (0..v.len()).enumerate() {
        v.get(i)
    }
    let after_rec2 = time::precise_time_ns();
    println!("Total time: {}", after_rec2 - before_rec2);
}

我很困惑,为什么这不起作用,因为error: cannot index a value of type `usize` --> src/main.rs:8:9 | 8 | v[i] | ^^^^ error: no method named `get` found for type `usize` in the current scope --> src/main.rs:17:11 | 17 | v.get(i) | ^^^ 应该给我一个索引,按其名称,我应该能够用来索引矢量。

  1. 为什么会抛出此错误?
  2. 我知道我可以/应该使用迭代而不是C风格的索引方式,但为了学习的目的,我用什么来迭代索引值,就像我想在这里做的那样?

1 个答案:

答案 0 :(得分:6)

你,朋友,在这里非常困惑。

fn main() {
    let v = vec![1; 1_000_000];

v的类型为Vec<i32>

for (i, v) in (0..v.len()).enumerate() {
    v[i]
}

您正在迭代一系列索引,从0v.len(),并使用enumerate生成索引:

  • v的类型为usize
  • 在循环中,v == i,始终

所以......的确,编译器是正确的,你不能在[]上使用usize

程序“已修复”:

extern crate time;

fn main() {
    let v = vec![1; 1_000_000];

    let before_rec1 = time::precise_time_ns();

    for i in 0..v.len() {
        v[i]
    }

    let after_rec1 = time::precise_time_ns();
    println!("Total time: {}", after_rec1 - before_rec1);


    let before_rec2 = time::precise_time_ns();

    for i in 0..v.len() {
        v.get(i)
    }

    let after_rec2 = time::precise_time_ns();
    println!("Total time: {}", after_rec2 - before_rec2);
}
但是,我会添加免责声明,如果我是编译器,这个无用的循环将被优化为noop。如果在使用--release进行编译后,您的计划报告0,则会发生这种情况。

Rust已内置benchmarking support,我建议您使用它而不是采用天真的方式。并且......你还需要检查发出的组件,这是确保你测量你的想法的唯一方法(优化编译器就像那样棘手)。