2016-08-02 11 views
1

は:任意の型のタプルとベクトルを定義し、私は要素の<code>std::vec::Vec</code><strong>を持つ任意の</strong>タイプにすることができ、フィールドでカスタム構造を定義しようとしている

use std::vec::Vec; 

#[derive(Debug, PartialEq)] 
pub struct BertDictionary { 
    data: Vec<(Any, Any)> // not work also with Vec<(_, _)> 
} 

コンパイル、これはE0308 error生成しますコンパイラが具体的な型を推論できないことを意味します。そのような構造を定義することは可能ですか?

例として、各要素が(name, "user"), (id, 1)などのように表される場合、このベクトルを使用します。

+3

あなたは 'AnyMap'を認識していますか? 'Any'から値を取り出すには、具体的な型を知る必要があることに注意してください。 @MatthieuM。 –

+0

。確かに、私はそれについて知っていますあなたのタイプのための特性を実装する必要がありますが、AnyMapについて何か知りません。おそらくそれはいいかもしれませんが、このトピックで説明しているこの構成を書くことができるかどうか疑問です – Relrin

+2

['AnyMap'](https://github.com/chris-morgan/anymap)はChris Morganと[' rust 「-typemap'」(https://github.com/reem/rust-typemap)は、Jonathan Reemによって調査されたものです。 –

答えて

2

Anyは、具体的な型ではなく、一般的な型パラメータを構造体に追加する必要があります。

struct BertDirectory<T: Any> { 
    data: Vec<T> 
} 

またTDebugPartialEqを実装して何かであることを確認したい場合があります。これはコンパイルする必要はありませんが、BertDirectoryがこれらの特性を常に実装していることを確認したい場合に使用します。それ以外の場合は、の場合にのみDebugが実装されます。

struct BertDirectory<T: Any + Debug + PartialEq> { 
    data: Vec<T> 
} 

はしても、私はこれがdataはまだシングルタイプを保持するために制約されますので、あなたが本当に欲しいもの、あなたを与えることを知っていないそれらのものの両方を与えられました。 Tは、構造体のインスタンスごとに単一の型しか表現できません。

あなたは、異なるタイプの値を格納するdataが必要な場合は、代わりのvtableを使用しての錆の道である、代わりにtrait objectsを使用してに見たいと思うかもしれません:

pub trait MyTrait: Debug { 
    // you can still use Any by doing MyTrait: Any + Debug 
    // Note that you won't be able to derive PartialEq for your trait 
    // because PartialEq can't be made into a TraitObject 

    // can also define whatever methods you would want on your data, which 
    // might be preferable to using Any, if possible 
} 

pub struct BertDirectory<T: MyTrait>{ 
    data: Vec<(Box<MyTrait>, Box<MyTrait>)> 
} 

その方法Tの具体的なタイプではないだろうコンパイル時に知る必要があります。 dataの各要素は、具体的な型とは異なる可能性があり、正しいメソッドが自動的に呼び出されます。しかし、あなたはPartialEqを派生させることができません。だから、自分でそれを実装しなければなりません。

+2

@Shepmaster私はそれを知らなかったが、それは本当に便利です。常に新しいことを学ぶのはいいですね。 – allTwentyQuestions