在一个模块中使用 Rc<T>s,在另一个模块中使用 Rc<RefCell<T>>s 引用相同的数据

Having Rc<T>s in one module and Rc<RefCell<T>>s in another referencing the same data

我有这样的数据结构:

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

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

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

pub mod network {
    mod nodes {...}

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

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

创建 Rc<RefCell<Node>>s

您是否知道如何在 network 模块中的可变节点旁边实现 nodes 模块中的不变性?

或者除了将 Node 结构中对前任节点的引用声明为 Rc<RefCell<Node>> 之外别无他法,即使我在这里不需要可变性(我想避免那个)?

Rust 有 single ownership。如果一个 Node 被一个 RefCell 拥有,它不能同时被另一个 Rc 拥有。

Node 可以通过 RefCell 在一个地方修改时,这些更改不能显示在 Rc<Node> 的其他地方。这将违反 Rc<Node>.

的不变性

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

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

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

  • 如果你只是有时需要可变性,Rcmake_mut that works without RefCell. And RefCell has a zero-cost get_mut 如果你已经有一个可变的访问它,所以你可以在特定情况下减少他们的开销.