Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What must I cast an `u8` to in able to use it as an index in my vector?

Tags:

rust

I have a 2D vector in Rust which I am trying to index with a dynamic u8 variable. An example of what I'm trying to do is below:

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

However, I get the error

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

In later versions of Rust, I get

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>>`

What must I cast the u8 to in able to use it as an index in my vector?

like image 577
mjkaufer Avatar asked Mar 03 '15 04:03

mjkaufer


1 Answers

Indices are of type usize; usize is used for sizes of collections, or indices into collections. It represents the native pointer size on your architecture.

This is what you need to use for this to work properly:

println!("{}", vec2d[usize::from(row)][usize::from(col)]);
like image 88
Brian Campbell Avatar answered Nov 06 '22 01:11

Brian Campbell