如何在Rust中创建包裹矢量的新实例?

ide*_*n42 2 types rust

我想创建自己的vector struct,以便可以附加其他方法。

pub struct MyStructVec(pub Vec<MyStruct>);
Run Code Online (Sandbox Code Playgroud)

完成此操作后,将如何创建此向量的新实例?

MyStructVec::new()无法识别。现有的矢量创建方法将如何与这种类型一起使用?(newwith_capacity...等)

oli*_*obk 8

一个新类型“隐藏”其内部。您无法透明地进入内部。要创建的新对象MyStructVec,您需要调用内部类型的构造函数,然后包装它:

MyStructVec(Vec::new())

MyStructVec(Vec::with_capacity(42))
Run Code Online (Sandbox Code Playgroud)

创建了这样的对象之后,您可以通过实现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
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我可以附加一些方法

那不是新类型的使用方式。新类型用于类型安全。如果您只想Vec<MyStruct>拥有新方法,请创建一个扩展特征:

trait VecMyStructExt {
    fn foo(&self);
}
impl VecMyStructExt for Vec<MyStruct> {
    fn foo(&self) { println!("foo"); }
}
Run Code Online (Sandbox Code Playgroud)