2017-09-07 8 views
2

私は錆に新しいです、そして、私は単純なビットごとのリプレイサーを書こうとしています。なぜRust配列のインデックス番号としてu8を使用できないのですか?

私が持っているコード:私はこの1つのようなエラーを得た

const TABLE: [u64; 8] = [ 
    0xC462A5B9E8D703F1, 
    0x68239A5C1E47BD0F, 
    0xB3582FADE174C960, 
    0xC821D4F670A53E9B, 
    0x7F5A816D093EB42C, 
    0x5DF692CAB78143E0, 
    0x8E25691CF4B0DA37, 
    0x17ED05834FA69CB2 
]; 

fn get_part(u: u64, i: u8) -> u8 { 
    ((u & (0xFu64 << (16 - i))) >> (16 - i)) as u8 
} 

fn process(o: u8, i1: u8, i2: u8) -> u8 { 
    let left: u8 = o >> 4; 
    let right: u8 = o & 0xF; 
    (get_part(TABLE[left], left) << 4) + get_part(TABLE[right], right) 
} 

error[E0277]: the trait bound `u8: std::slice::SliceIndex<[u64]>` is not satisfied 
    --> src/main.rs:24:15 
    | 
24 |  (get_part(TABLE[left], left) << 4) + get_part(TABLE[right], right) 
    |    ^^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize` 
    | 
    = help: the trait `std::slice::SliceIndex<[u64]>` is not implemented for `u8` 
    = note: required because of the requirements on the impl of `std::ops::Index<u8>` for `[u64]` 

それは私がu8を変換することができますどのようにもインデックス番号としてu8を使用することは違法だと、なぜ私が理解できません互換性があります(どのタイプが互換性があるか分かりません)。

+0

[MCVE]を作成するために、無関係な部分を削除して例を縮小してください。また、あなたは2つの質問をしているようです。 StackOverflowの投稿ごとに1つだけ質問してください。質問を編集して改善することができます。ありがとう:) –

+0

これは、すでに必要最小限のコードは、エラーメッセージは、fnのプロセスから、3番目の文です。 – Noqrax

+1

[This](https://play.rust-lang.org/?gist=920371cfd1796115560c01bbd8536f0a&version=stable)は*よりも最小限です*、そうですか? ;-) –

答えて

6

SliceIndexのマニュアルをsearching Rust std-lib referenceで見ることができます。 documentation pageの下部にあるこの形質の実施例のリストは、この形質がusizeおよび様々なusizeの範囲について実施されることを示している。

u8タイプのインデックスは実装されておらず、u8usizeにキャストする必要があります。

(get_part(TABLE[left as usize], left) << 4) + get_part(TABLE[right as usize], right) 
関連する問題