Vector 如何包装另一个类型并向其添加字段和方法?

Vector 如何包装另一个类型并向其添加字段和方法?,vector,rust,Vector,Rust,我知道在锈迹斑斑的世界里,继承是一个不好的词,但是考虑到下面的结构,肯定有某种方式 struct Glyph { // Fields } 要拥有一个新的Glyphs结构,它是Vec方法(push等)以及适合自身的字段和方法的包装器?您可以这样使用: 使用std::ops:{Deref,DerefMut}; 结构图示符; 结构图示符(Vec); impl字形{ fn new()->Self{ 字形(向量![])) } } 字形的impl-Deref{ 类型目标=Vec; fn deref

我知道在锈迹斑斑的世界里,继承是一个不好的词,但是考虑到下面的结构,肯定有某种方式

struct Glyph {
    // Fields
}
要拥有一个新的
Glyphs
结构,它是
Vec
方法(
push
等)以及适合自身的字段和方法的包装器?

您可以这样使用:

使用std::ops:{Deref,DerefMut};
结构图示符;
结构图示符(Vec);
impl字形{
fn new()->Self{
字形(向量![]))
}
}
字形的impl-Deref{
类型目标=Vec;
fn deref(&self)->&Vec{&self.0}
}
字形的impl-DerefMut{
fn deref_mut(&mut self)->&mut Vec{&mut self.0}
}
fn main(){
让mut gs=Glyphs::new();
推(字形);
推(字形);
println!((“gs.len:{}”,gs.len());
}
请注意,这不是继承。一个很大的限制是,您绝对不能阻止某人调用
Vec
的任何方法,因为他们可以手动将
字形
排序为
Vec
。您可以通过在
Glyphs
上定义方法来“覆盖”这些方法,但同样,有人可以通过手动取消对
Glyphs
的引用来在您背后进行操作


您也可以阅读。

您可以定义类型别名(即同义词):


在我看来,您不应该使用Deref和DerefMut来模拟继承的某些方面。它们用于编写自定义指针类型

当您编写这样的包装结构时,通常只需要一些
Vec
s功能。可能还有一些不变量需要保持。通过实施
Deref
DerefMut
您使您的
Glyphs
更难推理,也更容易误用。避免公开实现细节通常也是可取的


因此,解决方案是在
Glyphs
上实现所需的函数。这些可能只是少数。如果您真的需要全部或大部分的
Vec
s函数和trait实现,那么包装器结构不是正确的选择。

不幸的是,这实际上并没有回答所提出的问题:以及适合自身的字段和方法。非常感谢。
type Glyphs = Vec<Glyph>;
trait GlyphsExt {
    fn x(&self); // define extension method
}

impl GlyphsExt for Glyphs {
    fn x(&self) {
        // implement method here
    }
}