What am I doing wrong with the variable i below? Why does the compiler say I cannot index a Vec with a u32 and how do I fix it?
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);
}
Error:
error[E0277]: the type `[u32]` cannot be indexed by `u32`
--> src/main.rs:7:12
|
7 | if a[i] % 2 != 0 {
| ^^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `SliceIndex<[u32]>` is not implemented for `u32`
= note: required because of the requirements on the impl of `Index<u32>` for `Vec<u32>`
Playground
Indexing is made possible by Index and IndexMut traits.
You are using a Vec and it implements Index and IndexMut traits.
Although, it imposes a trait bound that type used to index should implement SliceIndex<[T]>:
impl<T, I> Index<I> for Vec<T>
where
I: SliceIndex<[T]>
SliceIndex is implemented for usize because of which it is possible to use type usize as index.
It is not implmented for u32 because of which you can't use u32 as index.
i has a type u32 because it is received from the range 0..number where number has type u32.
A simple fix would be to cast i to usize:
if a[i as usize] % 2 != 0
This cast can be safely done as long as you are on at least a 32 bit machine.
As per the definition of usize:
The size of this primitive is how many bytes it takes to reference any location in memory
Moreover, your code doesn't require you to use u32. Instead you should use usize from the start.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With