2016-12-02 63 views
0

我想創建我自己的矢量struct,所以我可以附加額外的方法。如何在Rust中創建包裝的矢量的新實例?

pub struct MyStructVec(pub Vec<MyStruct>); 

完成此操作後,將如何創建此矢量的新實例?

MyStructVec::new()未被識別。現有的矢量創建方法如何與這種類型一起使用? (new,with_capacity ...等)

回答

3

新類型「隱藏」它的內部。你不能透明地訪問內部。要創建的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()) 
    } 
} 

,但在對方的回答說,你不用直接拿到包裝類型的方法,在你的新的結構直接,所以你需要換你想要的人。 (在某些情況下,您可能會在某種程度上使用宏自動化)