4

Rust 配列 (一定サイズのもの、[T, ..Size]) に関する質問です。私は次の作業をしようとしています:

#[deriving(PartialEq)]
struct Test {
  dats : [f32, ..16]
}

導出を使用して独自の PartialEq を単純に記述できないことはわかっていますが、それはかなり不快です... 表示されるエラー メッセージもわかりにくいものです (以下を参照)。これを行うための適切な素朴な方法はありますか?

rustc ar.rs 
ar.rs:4:3: 4:20 error: mismatched types: expected `&&[f32]` but found `&[f32, .. 16]` (expected &-ptr but found vector)
ar.rs:4   dat : [f32, ..16]
          ^~~~~~~~~~~~~~~~~
note: in expansion of #[deriving]
ar.rs:2:1: 3:7 note: expansion site
ar.rs:4:3: 4:20 error: mismatched types: expected `&&[f32]` but found `&[f32, .. 16]` (expected &-ptr but found vector)
ar.rs:4   dat : [f32, ..16]
          ^~~~~~~~~~~~~~~~~
note: in expansion of #[deriving]
ar.rs:2:1: 3:7 note: expansion site
error: aborting due to 2 previous error

今日からラストナイトリービルドです。

ありがとう!

4

1 に答える 1

4

これはバグです: #7622 "固定長配列はトレイトを実装しません"。AB が言ったように、固定長配列の長さをパラメーター化する方法はないため、特性を実装する唯一の方法は、実際にそれらを書き出すことです。

impl PartialEq for [f32, .. 0] { ... }

impl PartialEq for [f32, .. 1] { ... }

impl PartialEq for [f32, .. 2] { ... }

impl PartialEq for [f32, .. 3] { ... }

// ...

(もちろん、これはマクロで行うことができます: しかし、すべての可能な特性に対してすべての可能な長さを実行することはまだ実行可能ではありません.)

derivingたとえば、なしで特性を自分で実装する必要があります。

struct Test { dats: [f32, .. 16] }

impl PartialEq for Test {
    fn eq(&self, other: &Test) -> bool {
        self.dats == other.dats
    }
}

fn main() {
    let a = Test { dats: [0.0, .. 16 ]};
    let b = Test { dats: [100.0, .. 16 ]};

    println!("{}", a == b);
}

実装せずに==withを使用できるのは奇妙だと思うかもしれません(これは、上記のように、ほとんどの型をオーバーロードする方法です): コンパイラには固定長ベクトルでどのように機能するかについての組み込みの理解があり、それを直接使用するため、機能します。特性に触れずに。[f32, .. 16]PartialEq==Test==

于 2014-06-15T07:37:34.407 に答える