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

Types 如何在Rust中创建包裹向量的新实例?,types,rust,Types,Rust,我想创建自己的vectorstruct,以便附加额外的方法 pub struct MyStructVec(pub Vec<MyStruct>); pub-struct-MyStructVec(pub-Vec); 完成此操作后,如何创建此向量的新实例 无法识别MyStructVec::new()。现有的向量创建方法如何用于这种类型?(new,具有容量等)新类型“隐藏”其内部。您无法对内部进行透明访问。要创建新的MyStructVec对象,需要调用内部类型的构造函数,然后将其包装:

我想创建自己的vector
struct
,以便附加额外的方法

pub struct MyStructVec(pub Vec<MyStruct>);
pub-struct-MyStructVec(pub-Vec);
完成此操作后,如何创建此向量的新实例

无法识别MyStructVec::new()。现有的向量创建方法如何用于这种类型?(
new
具有容量等)

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

MyStructVec(Vec::new())

MyStructVec(Vec::with_capacity(42))
创建这样一个对象后,通过为您的类型实现
Deref
DerefMut
,您可以稍微透明地使用该对象:

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
    }
}
MyStructVec的impl std::ops::Deref{ 类型目标=Vec; fn deref(&self)->&Vec{ &self.0 } } MyStructVec的impl std::ops::DerefMut{ fn deref_mut(&mut self)->&mut Vec{ &mutself.0 } }

所以我可以附加额外的方法

这不是新类型的使用方式。新类型用于类型安全。如果您希望所有的
Vec
都有新方法,请创建一个扩展特征:

trait VecMyStructExt {
    fn foo(&self);
}
impl VecMyStructExt for Vec<MyStruct> {
    fn foo(&self) { println!("foo"); }
}
trait向量结构文本{
fn foo(和self);
}
用于Vec的impl VecMyStructText{
fn foo(&self){println!(“foo”);}
}
无法识别MyStructVec::new()

实际上,因为您已经定义了一个新类型,但还没有定义任何方法。您可以轻松做到这一点:

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

但是正如在另一个答案中所说的,您不能直接在新结构上获得包装类型的方法,因此您需要包装所需的方法。(在某些情况下,您可能能够在某种程度上使用宏实现自动化)

使用trait而不是newtype意味着它可能无法用作返回类型,因为它没有大小。当您不关心实现隐藏时,使用newtype有什么问题?