在Rust中创建可变Trait对象的向量(有时是共享的)



我需要创建一个具有以下约束的指针堆栈:

  • 指针需要指向同一个Trait对象(因此Box看起来很合适(
  • 这些Trait对象可能需要修改(可能需要使用RefCell?(
  • 堆栈中的两个指针可能需要指向同一对象(Rc看起来很合适(

现在,我找到的唯一方法就是使用Vec<Rc<RefCell<Box<dyn MyTrait>>>>。这是最好的解决方案吗?它看起来像是访问对象所需的大量指针取消引用。

我不太确定你对的确切意思

指针需要指向相同的Trait对象(因此Box看起来很合适(

但是,如果您对存储实际不同类型的对象感兴趣,那么您需要trait对象,并且这些对象需要位于某种指针后面,例如BoxBox通常是一个很好的默认值(但也有其他选择(。

这些Trait对象可能需要修改(可能需要使用RefCell?(

实际上,这仍然可以用Box来完成。

堆栈中的两个指针可能需要指向同一对象(Rc看起来很合适(

在这里,这变得很困难,因为在Rust中,可共享和可变有点相互排斥。要使可共享,我们需要一个Rc,您可以将其视为共享框。然后,为了使它无论如何都是可变的,我们可以通过使用RefCell来使用内部可变性。所以,本质上是一个Rc<RefCell<_>>,你可以把它看作是一个可共享的&可变CCD_ 14。

最后,如果你把它们放在一个Vec中,你会得到:Vec<Rc<RefCell<dyn MyTrait>>>(没有Box(。

这允许您在Vec中具有不同的类型,其中甚至多次具有某些实例,并且仍然允许对每个实例进行可变访问。

最新更新