错误[E0277]:类型“[u32]”不能被“u32”索引
我对i下面的变量做错了什么?为什么编译器说我不能Vec用 a索引 a ,u32我该如何解决?
fn main() {
let a: Vec<u32> = vec![1, 2, 3, 4];
let number: u32 = 4;
let mut count = 0;
for i in 0..number {
if a[i] % 2 != 0 {
count += 1;
} else {
continue;
}
}
println!("{}", count);
}
错误:
fn main() {
let a: Vec<u32> = vec![1, 2, 3, 4];
let number: u32 = 4;
let mut count = 0;
for i in 0..number {
if a[i] % 2 != 0 {
count += 1;
} else {
continue;
}
}
println!("{}", count);
}
操场
回答
Index和IndexMut特征使索引成为可能。
您正在使用 aVec并且它实现Index和IndexMut特征。
虽然,它强加了一个 trait bound,用于索引的类型应该实现SliceIndex<[T]>:
impl<T, I> Index<I> for Vec<T>
where
I: SliceIndex<[T]>
SliceIndex为它实现,usize因此可以使用类型usize作为索引。
它没有实现u32,因此您不能u32用作索引。
i具有类型u32,因为它是从接收到的范围内0..number,其中number具有类型u32。
一个简单的解决方法是强制转换i为usize:
if a[i as usize] % 2 != 0
只要您至少在一32台机器上,就可以安全地完成此演员表。
根据usize的定义:
此原语的大小是引用内存中的任何位置所需的字节数
此外,您的代码不需要您使用u32. 相反,您应该usize从一开始就使用。