Arrays 阵列上的PartialEq

Arrays 阵列上的PartialEq,arrays,rust,deriving,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 `&a

关于锈菌阵列的问题(恒定大小的[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
从今天开始,我每天晚上都在铁锈上工作

谢谢

这是一个bug:“固定长度数组不实现任何特征”。正如A.B.所说,没有办法对固定长度数组的长度进行参数化,因此实现trait的唯一方法是实际写出它们:

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

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

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

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

// ...
(当然,这可以通过宏来实现:但要为所有可能的特征实现所有可能的长度仍然是不可行的。)

您需要自己实现这些特性,而不必派生
,例如

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
):它之所以有效,是因为编译器对
==
如何处理固定长度向量有内置的理解,因此直接使用它而不触及特征。

目前无法参数化
大小,因此编译器无法派生任何特征。你得自己动手,太好了!我从来没有想到==会起作用。我要做一个讨厌的for循环:(.如果数组长度超过30(比如,64),该怎么办?
对于“[u32;64]”,可能缺少一个“std::cmp::PartialEq”的实现。
@kirhgoff可以将数组强制为片
&self.dats[..]=&other.dats[..]
,例如。