以下の変数のどこが間違っているのでしょうかi
? コンパイラーが a をVec
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);
}
エラー:
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>`
ベストアンサー1
インデックス作成は以下によって可能となる。索引そしてインデックスミュート特性。
使用していますVec
そしてそれは実装するIndex
そしてIndexMut
特性。
ただし、インデックスに使用される型が実装する必要がある特性の境界が課せられます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
。
によると使用サイズの定義:
このプリミティブのサイズは、メモリ内の任意の場所を参照するのに必要なバイト数です。
さらに、コードでは を使用する必要はありませんu32
。 代わりに、usize
最初から を使用する必要があります。