2016-11-03 1 views
1

Eqのような形質を含む要素のベクトルが必要です。異種のベクターが必要です。たとえば: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 

は、それは私は関係なく、彼らのの比較することができ、物事へのポインタのリストを持つことが可能です:

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

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

私はEqがオブジェクトにすることができないと言うエラーメッセージが表示されますタイプ?

+1

あなたは '、特にVecとを代わりにEq''の 'Any'形質を使用して満足している場合> '作品([遊び場リンク](https://play.rust-lang.org/?gist=22fcc82ccea3f0b0aa0f3528f23d35a6&version=stable&backtrace=0))。 – Aurora0001

+0

ありがとう、しかし、私は本当にベクトルのものを比較することができる必要があります。 特に、より大きな問題は、異種キーを持つHas​​hMapを使用したいということです。 – 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-aryツリーなので、ジェネリック型パラメータを多少一般的にする必要があります。私は完全にEqとハッシュが必要です。 – FCo

+2

@FCo私たちはどのような種類のキーを話していますか?あなたはenumの周りにそれらをラップできませんか? –

+2

列挙型は優れた解決策であり、IMOです。それから、適切に 'Eq'を実装するのはデータ構造のユーザー次第です。 – Shepmaster

関連する問題