错误[E0277]:类型“[u32]”不能被“u32”索引

Mas*_*ai 6 slice rust vec

我对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);
}
Run Code Online (Sandbox Code Playgroud)

错误:

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);
}
Run Code Online (Sandbox Code Playgroud)

操场

小智 7

快速评论:不要将 的类型永远更改numberusize或不断地转换iusize1,可以使用以下结构,该结构仅出于循环的目的而转换number为:usizefor

fn main() {
    let a: Vec<u32> = vec![1, 2, 3, 4];
    let number: u32 = 4;
    let mut count = 0;

    for i in 0..number as usize {
        if a[i] % 2 != 0 {
            count += 1;
        } else {
            continue;
        }
    }
    println!("{}", count);
}
Run Code Online (Sandbox Code Playgroud)


Mih*_*hir 5

IndexIndexMut特征使索引成为可能。

您正在使用 aVec并且它实现IndexIndexMut特征。

虽然,它强加了一个 trait bound,用于索引的类型应该实现SliceIndex<[T]>

impl<T, I> Index<I> for Vec<T>
where
    I: SliceIndex<[T]>
Run Code Online (Sandbox Code Playgroud)

SliceIndex为它实现,usize因此可以使用类型usize作为索引。

它没有实现u32,因此您不能u32用作索引。

i具有类型u32,因为它是从接收到的范围内0..number,其中number具有类型u32


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

if a[i as usize] % 2 != 0
Run Code Online (Sandbox Code Playgroud)

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

根据usize定义

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


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