2014-06-14 3 views
2

녹 배열 (일정한 크기의 것들, [T, ..Size])에 관한 질문. 나는 다음과 같은 작업을 만들려고 노력하고 있어요 : 내가 파생 사용하고 단순히 내 자신의 PartialEq을 쓸 수 없습니다 알고PartialEq on array

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

을하지만 오히려 독이입니다 ... 주어진 오류 메시지가 (나에게도 비밀이다 아래 참조). 이것을하기위한 적절한 소박한 방법이 있습니까?

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 

저는 오늘 밤 야간에 지어졌습니다.

감사합니다.

+2

현재 '크기'를 매개 변수화 할 수 없으므로 컴파일러에서 특성을 추출 할 수 없습니다. 직접 구현해야합니다. –

답변

3

이것은 버그입니다 : #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); 
} 

당신은 이상한 당신이 (하나 과부하 위 Test 같은 대부분의 유형에 대한 ==, 어떻게되는)가 PartialEq을 구현하지 않고 [f32, .. 16]==를 사용할 수있는 생각 : 컴파일러가 내장되어 있기 때문에 이해 작동 ==이 고정 길이 벡터와 어떻게 작용하는지에 대한 설명이 없으므로 특성을 만지지 않고 직접 사용합니다.

+0

좋아요! 나는 결코 생각하지 못했을 것이다 == 작동 할 것이다. 나는 불쾌한 for 루프를 할 예정였다 : (. – luke