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
的成本为零,因此在特定情况下,您可以减少它们的开销