How to create new instances of a wrapped vector in Rust?

时间:2016-12-02 05:18:47

标签: types rust

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.)

2 个答案:

答案 0 :(得分:4)

新型&#34;隐藏&#34;它的内部。您无法透明地访问内部。要创建MyStructVec的新对象,需要调用内部类型的构造函数然后将其包装起来:

MyStructVec(Vec::new())

MyStructVec(Vec::with_capacity(42))

创建这样的对象后,您可以通过为您的类型实现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
    }
}
  

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

这不是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())
    }
}

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