5

編集者注: この質問は Rust 1.0 より前に出されたもので、もはや有効ではない構文を使用しています。さらに、この質問の特定の問題は、Rust 1.0 では発生しなくなりました。

唯一のフィールドである固定幅のバイト配列を含む構造体があります。forからのトレイトの実装std::cmpは簡単だと思うかもしれませんが、派生はうまくいきません:

#[deriving(Eq)]
pub struct ID {
    bytes: [u8, ..::constants::ID_SIZE]
}

src/id.rs:3:5: 3:40 error: mismatched types: expected `&&[u8]` but found `&[u8, .. 20]` ([] storage differs: expected `&` but found `20`)
src/id.rs:3     bytes: [u8, ..::constants::ID_SIZE]
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: in expansion of #[deriving]
src/id.rs:1:1: 2:4 note: expansion site

ドキュメントは、Eq が固定幅配列ではなく&[]andに対して実装されていることを示唆しています。~[]手動による強制も&[]機能しません:

impl Eq for ID {
    fn eq(&self, other: &ID) -> bool {
        (&self.bytes).eq(&other.bytes)
    }
}

src/id.rs:7:26: 7:38 error: mismatched types: expected `&&[u8, .. 20]` but found `&[u8, .. 20]` (expected &-ptr but found vector)
src/id.rs:7         (&self.bytes).eq(&other.bytes)
                                     ^~~~~~~~~~~~
src/id.rs:7:9: 7:39 error: failed to find an implementation of trait std::cmp::Eq for [u8, .. 20]
src/id.rs:7         (&self.bytes).eq(&other.bytes)
                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Rustリファレンスマニュアルのこの行はそれを説明するかもしれません:

一定サイズのベクトルを生成する式は、不定サイズのベクトルを期待するコンテキストでは評価できません。一定サイズのベクトルの内容を不定サイズの別個のベクトルにコピーする必要があります。

動機は定かではありませんが、長さの保存に関係があるのではないかと思います。

&[]とにかく、コピーせずに の実装を使用して 2 つの固定長配列を比較することは可能ですか?

4

1 に答える 1