2016-12-02 2 views
0

Ich möchte meinen eigenen Vektor struct erstellen, damit ich zusätzliche Methoden hinzufügen kann.Wie erstellt man neue Instanzen eines verpackten Vektors in Rust?

pub struct MyStructVec(pub Vec<MyStruct>); 

Nachdem dies getan wurde, wie würde eine neue Instanz dieses Vektors erstellt werden?

MyStructVec::new() wird nicht erkannt. Wie würden vorhandene Vektorerstellungsmethoden mit diesem Typ verwendet werden? (new, with_capacity ... usw.)

Antwort

3

Ein newtype "verbirgt" seine Interna. Sie erhalten keinen transparenten Zugang zum Innenraum. Um ein neues Objekt von MyStructVec zu erstellen, müssen Sie die innere Art Konstruktor aufrufen und dann wickeln:

MyStructVec(Vec::new()) 

MyStructVec(Vec::with_capacity(42)) 

Nach der Erstellung eines solchen Objekts, können Sie das Objekt etwas transparent nutzen, indem Deref und DerefMut Implementierung für Ihre Typ:

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 
    } 
} 

so kann ich zusätzliche Methoden anhängen

Das ist nicht die Art, wie neue Typen verwendet werden. Newtypes werden für die Typsicherheit verwendet. Wenn alles, was Sie wollen, dass alle Vec<MyStruct> neue Methoden haben, erstellen Sie eine Erweiterung Merkmal:

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

MyStructVec::new() wird nicht erkannt.

In der Tat, weil Sie einen neuen Typ definiert haben, aber noch keine Methoden definiert. Sie können so leicht tun:

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

aber wie gesagt auch in der anderen Antwort, die Sie den umschlossenen Typs Methoden direkt auf Ihre neue Struktur direkt nicht bekommen, so dass Sie das, die wickeln bräuchten Sie wollen. (In einigen Fällen können Sie es möglicherweise mithilfe von Makros automatisieren.)

Verwandte Themen