我在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
强制转换为能够将其用作向量中的索引吗?
答案 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 usize
比usize::from(x)
更具可读性,但这只是我的偏爱。
在您的情况下:
println!(“{}”, vec2d[row as usize][col as usize]);
之所以会这样,是因为v [i]确实被解析为*(&v + i)
,或者解析为(向量的内存地址+索引)中的值。由于&v
是内存地址,因此索引i也必须是内存地址类型。 Rust表示类型usize
的内存地址。
我知道已经回答了这个问题,但是我只喜欢x as usize
而不是usize::from(x)
。决定权在你。