繁体   English   中英

如何使用内部引用构建结构?

[英]How can I make a structure with internal references?

我正在尝试使用邻接列表创建一个图形,但我无法弄清楚如何为邻接列表中的引用指定适当的生命周期。

我想要得到的是以下内容:

struct Graph<T> {
    nodes : Vec<T>,
    adjacencies : Vec<Vec<&T>>
}

这不起作用,因为引用类型缺少生命周期说明符。 我想我可以使用索引作为邻接,但我实际上对内部参考问题感兴趣,这只是表达这个问题的工具。

我看到它的方式,应该可以安全地进行,因为节点是由对象拥有的。 应该允许它保持对这些节点的引用。

我对吗? 怎么能在Rust做到这一点? 或者,如果我错了,我错过了什么?

由于Rust的内存安全性而无法在Rust中使用引用来表示此概念 - 这样的对象在没有已存在的情况下无法构建。 只要nodesadjacencies是分开存储的,就可以了,但只要你尝试将它们连接在同一个结构中,它就无法工作。

替代方案是使用引用计数(如果不可变是Rc<T>或具有内部可变性的Rc<RefCell<T>> )或使用不安全指针( *const T*mut T )。

我认为这里有一个问题。 如果我们将它转​​换为C ++:

template <typename T>
struct Graph {
    std::vector<T> nodes;
    std::vector<std::vector<T*>> adjacencies;
};

adjacencies点指向nodes ,然后人们意识到存在一个问题: nodes上的操作使引用无效(例如重新分配)会将悬空指针留给adjacencies

我看到至少有两种方法可以解决这个问题:

  • 使用adjacencies索引,因为它们是稳定的
  • nodes使用一个间接级别,以便固定内存

在Rust中,这给出了:

struct Graph<T> {
    nodes: Vec<T>,
    adjacencies: Vec<Vec<uint>>,
};

struct Graph<T> {
    nodes: Vec<Rc<RefCell<T>>>,
    adjacencies: Vec<Vec<Rc<RefCell<T>>>>,
};

注意: RefCell允许通过引入运行时检查来改变T尽管它是别名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM