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>>>>,
};