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