【问题标题】:Shared pointer in rust arraysrust 数组中的共享指针
【发布时间】:2020-02-29 20:18:04
【问题描述】:

我有两个数组:

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】:

好吧,我花了一些时间试错,但我有一个丑陋的解决方案:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    相关资源
    最近更新 更多