在结构中使用VEC

时间:2019-03-31 10:07:02

标签: rust borrow-checker

我有一个带有类似结构的vec的结构:

struct ProcessNode {
    ...
    children: Vec<Rc<ProcessNode>>,
}

不幸的是,当我尝试将某些东西添加到vec时,我遇到了一个问题:

let mut parent_node: &mut Rc<ProcessNode> = ...
let mut parent_children: &mut Vec<Rc<ProcessNode>> = &mut parent_node.children;

现在parent_node在编译过程中检出,但parent_children无法以这种方式引用。为什么?以及如何附加到结构中的vec字段?

1 个答案:

答案 0 :(得分:1)

我假设这是您收到的错误消息?

error[E0596]: cannot borrow data in a `&` reference as mutable
  --> src/main.rs:11:58
   |
11 |     let mut parent_children: &mut Vec<Rc<ProcessNode>> = &mut parent_node.children;
   |                                                          ^^^^^^^^^^^^^^^^^^^^^^^^^ cannot borrow as mutable

由于Rc<T>使您可以使多个对象指向同一数据,因此只能让您获得对其内容的不可变引用,否则借阅检查器将无法保证它的内容在其他地方借用代码时,不会在代码中进行任何更改。

解决方法通常是使用Rc<RefCell<T>>,这是一种容器类型,可让您使用不可变的引用获取对数据的可变引用,并在运行时借用 而不是编译时间:

let parent_node: &Rc<RefCell<ProcessNode>> = ...;

// get a mutable reference to the ProcessNode
// (this is really a RefMut<ProcessNode> wrapper, and this needs to be in scope for as
// long as the reference is borrowed)
let mut parent_node_mut: RefMut<'_, ProcessNode> = parent_node.borrow_mut();

// get mutable reference to children
let parent_children: &mut Vec<_> = &mut parent_node_mut.children;

Playground example

您可以在文档here

中了解有关将RefCellRc结合使用的更多信息