Rust 如何创建具有内部引用的结构?
我试图用邻接列表创建一个图,但我不知道如何为邻接列表中的引用指定适当的生存期 我想说的是:Rust 如何创建具有内部引用的结构?,rust,Rust,我试图用邻接列表创建一个图,但我不知道如何为邻接列表中的引用指定适当的生存期 我想说的是: struct Graph<T> { nodes : Vec<T>, adjacencies : Vec<Vec<&T>> } 结构图{ 节点:Vec, 邻接:Vec } 这将不起作用,因为引用类型缺少生存期说明符。我想我可以使用邻接指数,但我实际上对内部参考问题感兴趣,这只是一个表达这个问题的工具 在我看来,这应该是安全的,因为节
struct Graph<T> {
nodes : Vec<T>,
adjacencies : Vec<Vec<&T>>
}
结构图{
节点:Vec,
邻接:Vec
}
这将不起作用,因为引用类型缺少生存期说明符。我想我可以使用邻接指数,但我实际上对内部参考问题感兴趣,这只是一个表达这个问题的工具
在我看来,这应该是安全的,因为节点属于对象。应该允许它保留对周围那些节点的引用
我说得对吗?如何在生锈的情况下实现这一点?或者,如果我错了,我错过了什么?由于Rust的内存安全性,在Rust中不可能仅使用引用来表示此概念,因此如果没有已有的对象,则无法构建此对象。只要
节点
和邻接
是分开存储的,就可以了,但只要您尝试将它们连接到同一结构中,就无法使其工作
替代方法是使用引用计数(
Rc
,如果immutable是OK的,或者Rc
具有内部可变性),或者使用不安全的指针(*const T
或*mut T
)。我认为这里有一个问题。如果我们将其转换为C++:
template <typename T>
struct Graph {
std::vector<T> nodes;
std::vector<std::vector<T*>> adjacencies;
};
注意:
RefCell
通过引入运行时检查,允许变异T
,尽管它有别名。无关:原始海报需要一个不变的结构。
struct Graph<T> {
nodes: Vec<T>,
adjacencies: Vec<Vec<uint>>,
};
struct Graph<T> {
nodes: Vec<Rc<RefCell<T>>>,
adjacencies: Vec<Vec<Rc<RefCell<T>>>>,
};