`[u32]` を `u32` でインデックスできないのはなぜですか? 質問する

`[u32]` を `u32` でインデックスできないのはなぜですか? 質問する

以下の変数のどこが間違っているのでしょうかi? コンパイラーが a をVeca でインデックスできないと表示するのはなぜですか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..numbernumberu32


i簡単な修正方法は、次のようにキャストすることですusize:

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

このキャストは、少なくともビットマシンを使用している限り、安全に実行できます32

によると使用サイズの定義:

このプリミティブのサイズは、メモリ内の任意の場所を参照するのに必要なバイト数です。


さらに、コードでは を使用する必要はありませんu32。 代わりに、usize最初から を使用する必要があります。

おすすめ記事