【发布时间】:2019-03-30 21:21:50
【问题描述】:
我正在尝试在 Rust 中创建一个不相交的集合结构。看起来是这样的
struct DisjointSet<'s> {
id: usize,
parent: &'s mut DisjointSet<'s>,
}
默认的不相交集是一个单例结构,其中父级引用自身。因此,我希望可以选择执行以下操作:
let a: DisjointSet = DisjointSet {
id: id,
parent: self,
};
self 是对将要创建的对象的引用。
我已尝试通过创建自定义构造函数来解决此问题。但是,我的尝试失败了,因为不允许部分初始化。编译器建议使用Option<DisjointSet<'s>>,但这很丑陋。你有什么建议吗?
我的问题不同于Structure containing fields that know each other 因为我有兴趣获取对将要创建的结构的引用。
【问题讨论】:
-
您是否尝试过创建一个
new函数来构造一个实例,然后在返回之前对其进行修补? -
&mut无论如何都不会对父引用起作用,因为它不允许别名。&允许这样做,但仍然需要一些体操(如果您想在构建后更改id,还需要一个Cell)。它还对所有DisjointSets 的集合提出了奇怪的要求(例如,不能有Vec<DisjointSet<'s>>)。一个不相交的数据结构实际上是一个 DAG,即一个图,而图在 Rust 中编码很麻烦。我倾向于通过索引推荐传统的实现方式(parent: usize,隐含地指其他地方的Vec<DisjointSet>)。
标签: rust