I'd like to create my own vector struct
, so I can attach extra methods.
pub struct MyStructVec(pub Vec<MyStruct>);
Having done this, how would a new instance of this vector be created?
MyStructVec::new()
isn't recognized. How would existing vector creation methods be used with this type? (new
, with_capacity
... etc.)
答案 0 :(得分:4)
新型&#34;隐藏&#34;它的内部。您无法透明地访问内部。要创建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
}
}
所以我可以附加额外的方法
这不是newtypes的使用方式。 Newtypes用于类型安全。如果您想要的是所有Vec<MyStruct>
都有新方法,请创建扩展特征:
trait VecMyStructExt {
fn foo(&self);
}
impl VecMyStructExt for Vec<MyStruct> {
fn foo(&self) { println!("foo"); }
}
答案 1 :(得分:2)
MyStructVec::new()
无法识别。
确实,因为您已经定义了一种新类型但尚未定义任何方法。你可以轻松地这样做:
impl MyStructVec {
pub fn new() -> MyStructVec {
MyStructVec(Vec::new())
}
}
但正如在另一个答案中说的那样,你不能直接在你的新结构上获得包装类型的方法,所以你需要包装你想要的那些。 (在某些情况下,您可以在某种程度上使用宏自动化)