锈数组中的共享指针

问题描述 投票:1回答:1

我有两个数组:

struct Data {
    all_objects: Vec<Rc<dyn Drawable>>;
    selected_objects: Vec<Rc<dyn Drawable>>;
}

selected_objects被确保为all_objects的子集。我希望能够以某种方式添加或删除对所选对象的mutable引用。

我可以轻松地将对象添加到selected_objects

Rc::get_mut(selected_object).unwrap().select(true);
self.selected_objects.push(selected_object.clone());

但是,如果我以后尝试:

for obj in self.selected_objects.iter_mut() {
    Rc::get_mut(obj).unwrap().select(false);
}

这将给出一个运行时错误,与get_mut的文档相匹配:“否则返回None,因为对共享值进行突变是不安全的。”

但是,我确实希望能够访问和调用两个数组上的任意方法,因此我可以高效地执行选择操作,同时仍然可以对所有对象执行操作。

[似乎Rc不支持此功能,似乎RefMut缺少一个Clone(),它使我无法将其放入多个数组中,并且实际上不支持dyn类型。 Box也缺少Clone()。所以我的问题是,如何将可写指针存储在多个数组中?为此还有其他类型的智能指针吗?我需要嵌套它们吗?还有其他一些数据结构更合适吗?有没有办法放弃可写参考?

arrays rust smart-pointers
1个回答
0
投票

好吧,这花了我一些试验和错误,但是我有一个丑陋的解决方案:

struct Data {
    all_objects: Vec<Rc<RefCell<dyn Drawable>>>;
    selected_objects: Vec<Rc<RefCell<dyn Drawable>>>;
}

Rc允许您存储对一个对象的多个引用。 RefCell使这些引用可变。现在,我唯一要做的就是每次使用对象时都调用.borrow()

虽然这似乎可行并且相当通用,但是我仍然愿意寻求更清洁的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.