我需要创建一个具有以下约束的指针堆栈:
- 指针需要指向同一个Trait对象(因此
Box
看起来很合适( - 这些Trait对象可能需要修改(可能需要使用
RefCell
?( - 堆栈中的两个指针可能需要指向同一对象(
Rc
看起来很合适(
现在,我找到的唯一方法就是使用Vec<Rc<RefCell<Box<dyn MyTrait>>>>
。这是最好的解决方案吗?它看起来像是访问对象所需的大量指针取消引用。
我不太确定你对的确切意思
指针需要指向相同的Trait对象(因此
Box
看起来很合适(
但是,如果您对存储实际不同类型的对象感兴趣,那么您需要trait对象,并且这些对象需要位于某种指针后面,例如Box
。Box
通常是一个很好的默认值(但也有其他选择(。
这些Trait对象可能需要修改(可能需要使用
RefCell
?(
实际上,这仍然可以用Box
来完成。
堆栈中的两个指针可能需要指向同一对象(
Rc
看起来很合适(
在这里,这变得很困难,因为在Rust中,可共享和可变有点相互排斥。要使可共享,我们需要一个Rc
,您可以将其视为共享框。然后,为了使它无论如何都是可变的,我们可以通过使用RefCell
来使用内部可变性。所以,本质上是一个Rc<RefCell<_>>
,你可以把它看作是一个可共享的&可变CCD_ 14。
最后,如果你把它们放在一个Vec
中,你会得到:Vec<Rc<RefCell<dyn MyTrait>>>
(没有Box
(。
这允许您在Vec
中具有不同的类型,其中甚至多次具有某些实例,并且仍然允许对每个实例进行可变访问。