PartialEq数组

时间:2014-06-14 17:11:33

标签: arrays rust deriving

关于生锈阵列的问题(常数大小,[T,..大小])。我正在尝试做以下工作:

#[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

我从今天开始每夜生锈。

谢谢!

1 个答案:

答案 0 :(得分:4)

这是一个错误:#7622"定长数组不实现特征"。作为A.B.说,没有办法参数化固定长度数组的长度,所以实现特征的唯一方法是实际写出来:​​

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);
}

您可能会觉得奇怪的是,==[f32, .. 16]一起使用PartialEq而没有实现==(对于大多数类型,这是Test的重载方式,例如{{1}上面):它起作用,因为编译器对==如何使用固定长度向量有内在的理解,因此直接使用它而不触及特征。