0

我有一个这样的数据结构:

mod nodes {
    struct Node {
        predecessors: Vec<Rc<Node>>
    }
}

我显然不需要该模块中节点的可变性。我这里也没有循环引用。

但我有另一个模块,其中包含节点,我需要可变性:

pub mod network {
    mod nodes {...}

    struct Network {
        nodes: Vec<Vec<Rc<RefCell<Node>>>>
    }
}

我只是想不出一种方法来Rc<Node>为节点本身创建 s 以及Rc<RefCell<Node>>Network.

您对如何在nodes模块中可变节点旁边的模块中实现不变性有任何想法network吗?

Node或者除了将结构内的前任节点的引用声明为 之外没有其他方法Rc<RefCell<Node>>,即使我在这里不需要可变性(我想避免这种情况)?

4

1 回答 1

1

Rust 拥有单一所有权。如果 aNode由 a 拥有RefCell,则它不能同时由不同的人拥有Rc

当 aNode可以在一个地方通过 修改时RefCell,这些更改不能在Rc<Node>. 这将违反Rc<Node>.

另请注意,这Node是一个结构值,而不是指向对象的指针。没有额外的间接层甚至可以在RefCell和 other之间共享它Rc。它的数据被复制并内联在它的容器中。

  • 考虑Rc<RefCell<Node>>在这两个地方使用。如果在两个地方使用相同的数据,它必须在两个地方都支持所有保证,即使你没有利用这一点。

  • 如果您没有同时使用这两种类型,则可以通过解构它(into_inner, try_unwrap)并再次构造另一种类型来从一种类型转换为另一种类型。这种转换不是免费的,因为这些类型的物理内存布局不同。

  • 如果您只是有时需要可变性,那么Rc没有. 如果您已经拥有对它的可变访问权限,则成本为零,因此您可以在特定情况下减少它们的开销。make_mutRefCellRefCellget_mut

于 2020-03-02T00:52:34.447 回答