我有两个数组:
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()
。所以我的问题是,如何将可写指针存储在多个数组中?为此还有其他类型的智能指针吗?我需要嵌套它们吗?还有其他一些数据结构更合适吗?有没有办法放弃可写参考?
好吧,这花了我一些试验和错误,但是我有一个丑陋的解决方案:
struct Data {
all_objects: Vec<Rc<RefCell<dyn Drawable>>>;
selected_objects: Vec<Rc<RefCell<dyn Drawable>>>;
}
Rc
允许您存储对一个对象的多个引用。 RefCell
使这些引用可变。现在,我唯一要做的就是每次使用对象时都调用.borrow()
。
虽然这似乎可行并且相当通用,但是我仍然愿意寻求更清洁的解决方案。