2016-11-03 1 views
1

Eq과 같은 특성을 포함하는 요소의 벡터를 원하며 이질적인 벡터가 필요합니다. 예를 들어 :Eq를 구현하는 유형의 이기종 벡터를 가질 수 있습니까?

let mut x: Vec<Eq> = Vec::new(); 

x.push(1); 
x.push("hello") 

나는 Eq 객체로 할 수 없다는 오류 메시지가 얻을 :에 관계없이 내가 비교할 수있는 일에 대한 포인터의 목록을 가지고

error[E0038]: the trait `std::cmp::Eq` cannot be made into an object 
--> src/main.rs:2:20 
    | 
2 |  let mut x: Vec<Eq> = Vec::new(); 
    |     ^^ the trait `std::cmp::Eq` cannot be made into an object 
    | 
    = note: the trait cannot use `Self` as a type parameter in the supertrait listing 

이 가능 그들의 유형?

+1

당신은'특히 VEC를 대신 Eq''의'Any' 특성을 사용하는 것이 행복 경우 >'작품 ([놀이터 링크] (https://play.rust-lang.org/?gist=22fcc82ccea3f0b0aa0f3528f23d35a6&version=stable&backtrace=0)). – Aurora0001

+0

고마워,하지만 난 정말 벡터의 것들을 비교할 수 있어야합니다. 특히 큰 문제는 이기종 키가있는 HashMap을 갖고 싶습니다. – FCo

답변

6

유형에 관계없이 비교할 수있는 것에 대한 포인터 목록을 가질 수 있습니까?

이것은 의미가 없습니다. StringFile 또는 SocketGuiWindowFontFamily을 어떻게 비교합니까?

코드에는 몇 가지 사소한 문제가 있습니다. 즉, 특성에 대한 간접 지정이 부족합니다. 객체 안전과 싸우지 않을 때 이기종 벡터를 만드는 방법에 대한 좋은 개요는 What is the best way to create a heterogeneous collection of objects?을 참조하십시오.

오브젝트 안전성이라고하면, there's a great blog series on the subject과 같이 구체적인 오류에 대한 세부 정보가 나와 있습니다.

그래서 우리는 무엇을 할 수 있습니까? 우선, 우리는 더 구체적 일 수있다 : 우리는 벡터의 모든 것이 u8 비교 될 수 없다는되며, 각각 비교 될 수있다 가능성의 개방형 무한대가 아니기 때문에이 작동

let mut x: Vec<Box<PartialEq<u8>>> = Vec::new(); 

에.

또한 일을 비교하는 방법을 지시하는 몇 가지 특성을 구현 한 다음 해당 사용할 수 있습니다

trait Silly { 
    fn silly(&self) -> usize; 
} 

impl Silly for u8 { 
    fn silly(&self) -> usize { *self as usize } 
} 

impl Silly for bool { 
    fn silly(&self) -> usize { 1 } 
} 

fn main() { 
    let mut x: Vec<Box<Silly>> = Vec::new(); 
} 
+0

감사합니다. 다른 유형의 항목을 비교하는 것은 매우 간단하지만 다른 유형의 값은 항상 다르지만 같은 유형의 값은 동일 할 수 있습니다. 필자가 생각하기에, 구현하고자하는 것은 각 레벨마다 다른 유형의 키가있는 n- 트리입니다. 따라서 제네릭 형식 매개 변수가 다소 일반화되어 있어야하며 Eq와 해시가 필요합니다. – FCo

+2

@FCo 우리가 말하는 핵심 유형은 무엇입니까? 열거 형 주위에 그들을 감쌀 수 없습니까? –

+2

enum은 훌륭한 솔루션 인 IMO입니다. 그런 다음 적절하게'Eq'를 구현하는 것은 데이터 구조의 사용자에게 달려 있습니다. – Shepmaster

관련 문제