Data structures 具有Rc<;T>;一个模块中的s和Rc<;RefCell<;T>&燃气轮机;引用相同数据的另一个中的

Data structures 具有Rc<;T>;一个模块中的s和Rc<;RefCell<;T>&燃气轮机;引用相同数据的另一个中的,data-structures,rust,interior-mutability,Data Structures,Rust,Interior Mutability,我的数据结构如下: mod nodes { struct Node { predecessors: Vec<Rc<Node>> } } mod节点{ 结构节点{ 前任:Vec } } 我显然不需要那个模块中节点的可变性。我这里也没有循环引用 但我有另一个模块,其中包含节点,我需要可变性: pub mod network { mod nodes {...} struct Network { nodes:

我的数据结构如下:

mod nodes {
    struct Node {
        predecessors: Vec<Rc<Node>>
    }
}
mod节点{
结构节点{
前任:Vec
}
}
我显然不需要那个模块中节点的可变性。我这里也没有循环引用

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

pub mod network {
    mod nodes {...}

    struct Network {
        nodes: Vec<Vec<Rc<RefCell<Node>>>>
    }
}
pub-mod网络{
mod节点{…}
结构网络{
节点:Vec
}
}
我只是想不出一种方法来为节点本身创建
Rc
s,同时为
网络创建
Rc
s

您知道如何在
网络
模块中可变节点旁边的
节点
模块中实现不变性吗

或者,除了将
节点
结构中对前置节点的引用声明为
Rc
,没有其他方法,即使我不需要这里的可变性(我希望避免这种情况)

Rust已经存在。如果
节点
属于
RefCell
,则它不能同时属于其他
Rc

如果可以通过
RefCell
在一个位置修改
节点
,则不允许在
Rc
中的其他位置显示这些更改。这将违反
Rc
的不变性

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

  • 考虑在这两个地方使用
    Rc
    。如果在这两个地方使用相同的数据,它必须在这两个地方维护所有保证,即使您没有利用这些保证

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

  • 如果您只是有时需要可变性,
    Rc
    有一个在没有
    RefCell
    的情况下工作的方法。如果您已经有了对它的可变访问权,那么
    RefCell
    的成本为零,因此在特定情况下,您可以减少它们的开销