2014-09-25 4 views
3

Я пытаюсь написать некоторые основные общие:Ржавчина: PartialEq черта дженериков

pub struct MyGeneric<T> { 
    vec: Vec<T> 
} 

impl<T> MyGeneric<T> { 
    fn add(&mut self, item: T) { 
     if !self.vec.contains(&item) { 
      self.vec.push(item); 
     } 
    } 
} 

но получаю сообщение об ошибке:

priority_set.rs:23:10: 23:35 error: the trait `core::cmp::PartialEq` is not implemented for the type `T` 
priority_set.rs:23  if !self.vec.contains(&item) { 
          ^~~~~~~~~~~~~~~~~~~~~~~~~ 
error: aborting due to previous error 

Я пытался реализовать PartialEq несколькими способами, глядя в API docs, но не смог найти решение самостоятельно. Я не очень хорошо знаком с концепцией черт, поэтому мне нужна помощь.

Спасибо.

ответ

5

Вы должны ограничить все возможные значения T на те, которые реализуют PartialEq, так как определение Vec::contains() требует:

pub struct MyGeneric<T> { 
    vec: Vec<T> 
} 

// All you need is to add `: PartialEq` to this impl 
// to enable using `contains()` 
impl<T: PartialEq> MyGeneric<T> { 
    fn add(&mut self, item: T) { 
     if !self.vec.contains(&item) { 
      self.vec.push(item); 
     } 
    } 
} 

fn main() 
{ 
    let mut mg: MyGeneric<int> = MyGeneric { vec: Vec::new() }; 
    mg.add(1); 
} 

Универсальные типы требуют уточнить некоторые ограничения на их параметры большую часть времени, в противном случае это было бы невозможно проверить, что общий код является правильным. Здесь, например, использует оператор == для элементов, но не каждый тип может иметь этот оператор. Стандартный признак PartialEq определяет оператора ==, поэтому все, что реализует этот признак, гарантированно имеет этого оператора.

+0

Не могли бы вы расширить свой пример кода? Кажется, я начинаю понимать, но не совсем уверен. – bbrodriges

+0

@ bender.rodriges Я включил минимальный пример, который компилируется в Rust 0.11. – hamstergene

+0

Теперь я понял! Я думал, что обозначение означает деривацию. Все это время я пытался реализовать его, как fmt :: Show trait. Спасибо! – bbrodriges

Смежные вопросы