我必须将一个'u8`转换为能够在我的向量中使用它作为索引吗?

时间:2015-03-03 04:04:47

标签: rust

我在Rust中有一个2D向量,我试图用动态u8变量进行索引。我尝试做的一个例子如下:

fn main() {
    let mut vec2d: Vec<Vec<u8>> = Vec::new();

    let row: u8 = 1;
    let col: u8 = 2;

    for i in 0..4 {
        let mut rowVec: Vec<u8> = Vec::new();
        for j in 0..4 {
            rowVec.push(j as u8);
        }
        vec2d.push(rowVec);
    }

    println!("{}", vec2d[row][col]);
}

然而,我收到错误

error: the trait `core::ops::Index<u8>` is not implemented for the type `collections::vec::Vec<collections::vec::Vec<u8>>` [E0277]

在Rust的后续版本中,我得到了

error[E0277]: the trait bound `u8: std::slice::SliceIndex<[std::vec::Vec<u8>]>` is not satisfied
  --> src/main.rs:15:20
   |
15 |     println!("{}", vec2d[row][col]);
   |                    ^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
   |
   = help: the trait `std::slice::SliceIndex<[std::vec::Vec<u8>]>` is not implemented for `u8`
   = note: required because of the requirements on the impl of `std::ops::Index<u8>` for `std::vec::Vec<std::vec::Vec<u8>>`

我必须将u8强制转换为能够将其用作向量中的索引吗?

2 个答案:

答案 0 :(得分:25)

指数属于usize; usize用于集合的大小或集合的索引。它表示架构上的本机指针大小。

这是您需要使用的方法才能正常工作:

println!("{}",vec2d[row as usize][col as usize]);

答案 1 :(得分:0)

您应该将其强制转换为usize,我认为它比 your_vector[index_u8]中的使用your_vector[index_u8 as usize]

我个人认为x as usizeusize::from(x)更具可读性,但这只是我的偏爱。 在您的情况下: println!(“{}”, vec2d[row as usize][col as usize]);

之所以会这样,是因为v [i]确实被解析为*(&v + i),或者解析为(向量的内存地址+索引)中的值。由于&v是内存地址,因此索引i也必须是内存地址类型。 Rust表示类型usize的内存地址。

我知道已经回答了这个问题,但是我只喜欢x as usize而不是usize::from(x)。决定权在你。