错误[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并且它实现IndexIndexMut特征。

虽然,它强加了一个 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


一个简单的解决方法是强制转换iusize

if a[i as usize] % 2 != 0

只要您至少在一32台机器上,就可以安全地完成此演员表。

根据usize的定义:

此原语的大小是引用内存中的任何位置所需的字节数


此外,您的代码不需要您使用u32. 相反,您应该usize从一开始就使用。


以上是错误[E0277]:类型“[u32]”不能被“u32”索引的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>