2016-12-02 16 views
0

私自身のベクトルstructを作りたいので、余分な方法を付け加えることができます。ラストでラップされたベクトルの新しいインスタンスを作成する方法は?

pub struct MyStructVec(pub Vec<MyStruct>); 

これを実行したら、このベクターの新しいインスタンスはどのように作成されますか?

MyStructVec::new()が認識されません。このタイプでは、既存のベクター作成メソッドはどのように使用されますか? (new,with_capacity ...など)

答えて

3

newtypeは内部を「隠す」。インテリアへの透明なアクセスは得られません。 MyStructVecの新しいオブジェクトを作成し、あなたがインナータイプのコンストラクタを呼び出し、それをラップする必要がありますするには:

MyStructVec(Vec::new()) 

MyStructVec(Vec::with_capacity(42)) 

そのようなオブジェクトの作成後、あなたはあなたのためのDerefDerefMutを実装することで、やや透過的にオブジェクトを使用することができますタイプ:

impl std::ops::Deref for MyStructVec { 
    type Target = Vec<MyStruct>; 
    fn deref(&self) -> &Vec<MyStruct> { 
     &self.0 
    } 
} 

impl std::ops::DerefMut for MyStructVec { 
    fn deref_mut(&mut self) -> &mut Vec<MyStruct> { 
     &mut self.0 
    } 
} 

ので、私は余分な方法

を添付することができます

これは、newtypesが使用される方法ではありません。新しい型は型の安全に使用されます。あなたが望むすべてがすべてVec<MyStruct>は、新しいメソッドを持っているということである、拡張形質を作成する場合:

trait VecMyStructExt { 
    fn foo(&self); 
} 
impl VecMyStructExt for Vec<MyStruct> { 
    fn foo(&self) { println!("foo"); } 
} 
2

MyStructVec::new()認識されていません。

実際には、新しいタイプを定義しましたが、まだどのメソッドも定義していないためです。あなたはそう簡単に行うことができます

impl MyStructVec { 
    pub fn new() -> MyStructVec { 
     MyStructVec(Vec::new()) 
    } 
} 

けどとして

は、あなたが欲しいものをラップする必要があると思いますので、あなたは、直接あなたの新しい構造体に直接ラップタイプのメソッドを取得しない他の回答でも述べました。 (マクロを使用してある程度自動化することができる場合もあります)

関連する問題